我与Hibernate一起使用JPA开发了一个项目,并且有两个线程:
如果我从线程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的二级缓存,而绕过了会话缓存的存储和检索模式,则发生的确切情况是因为我无法理解,以及如何在不清除的情况下解决此问题每次读取后的持久性上下文?
谢谢。
答案 0 :(得分:0)
默认情况下,第二级缓存在Hibernate中是禁用的(其属性不适用)。您在这里处理一级缓存。它在休眠会话期间存在。
会话充当持久性数据的事务级缓存。一旦实体成为 托管,则将该对象添加到内部 当前持久性上下文(EntityManager或Session)的缓存。 持久性上下文也称为第一级缓存,它是 默认情况下启用。
http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#