Jpa Hibernate:读取更新的值问题

时间:2019-03-21 11:17:12

标签: hibernate jpa caching sql-update dml

我与Hibernate一起使用JPA开发了一个项目,并且有两个线程:

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

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

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

__init__()

另一件事是我将记录器配置为波纹管:

    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);

向我显示所有sql和设置/返回的值。我观察到,第一次读取时,它从数据库中读取每个值,第二次读取后,如果要插入数据,则仅读取id和新插入的值...但是更新时看起来没有什么不同。

因此,考虑到我没有使用Hibernate的二级缓存,而绕过了会话缓存的存储和检索模式,则发生的确切情况是因为我无法理解,以及如何在不清除的情况下解决此问题每次读取后的持久性上下文?

谢谢。

1 个答案:

答案 0 :(得分:0)

默认情况下,第二级缓存在Hibernate中是禁用的(其属性不适用)。您在这里处理一级缓存。它在休眠会话期间存在。

  

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

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