Jpa Hibernate:阅读更新的值问题

问题描述 投票:0回答:1

我使用JPA和Hibernate开发了一个项目,我有两个线程:

  • 线程A:始终读取并输出差异
  • 线程B:有一些写操作和一个在完成写入数据后提交的事务

如果我从数据库中删除数据或从数据库中插入新数据,则在从线程B提交事务之后,在线程A中,我看到了差异,即删除或添加了一些数据。我的问题是当我更新现有数据时:提交后,线程A看不到差异,除非我在每次读取后都没有清除EntityManager。

这些是放在实体管理器上的属性:

    EntityManager em = EMF.createEntityManager();
    em.setProperty("hibernate.connection.autocommit", false);
    em.setProperty("hibernate.connection.isolation", 2); // read committed
    em.setProperty("javax.persistence.cache.storeMode", javax.persistence.CacheStoreMode.BYPASS);
    em.setProperty("javax.persistence.cache.retrieveMode", javax.persistence.CacheRetrieveMode.BYPASS);
    em.setProperty("hibernate.cache.use_query_cache", false);
    em.setProperty("hibernate.cache.use_second_level_cache", false);

另一件事是我将记录器配置如下:

log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout

向我展示所有sql和setted / returrned值。我观察到,在第一次读取时,它从数据库中读取每个值,并在第二次读取只有插入数据时的ID和新插入值...但是当它关​​于更新时没有任何看起来不同。

所以,考虑到我没有使用Hibernate的二级缓存,并且我绕过了会话缓存的存储和检索模式,更多的是因为我无法理解以及如何在不清除持久化上下文的情况下解决此问题每次阅读后?

谢谢。

hibernate jpa caching sql-update dml
1个回答
0
投票

Hibernate默认禁用二级缓存(属性不适用)。你在这里处理一级缓存。它存在于Hibernate会话期间。

会话充当持久数据的事务级缓存。一旦实体被管理,该对象就会被添加到当前持久化上下文(EntityManager或Session)的内部缓存中。持久性上下文也称为第一级缓存,默认情况下已启用。

http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#

© www.soinside.com 2019 - 2024. All rights reserved.