Java 休眠一级缓存-是否同步?

Java 休眠一级缓存-是否同步?,java,hibernate,jpa,hibernate-session,Java,Hibernate,Jpa,Hibernate Session,我知道是Hibernate使用的一级缓存,一旦我们从会话中检索到一个实体,对具有相同标识符的同一实体的后续get调用将从会话而不是数据库中获取,直到会话打开为止 话虽如此,我对hibernate如何将一级缓存与DB同步表示怀疑?考虑下面的场景 //Lets say I have created the session Session s1 = sessionFactory.getSession(); User u1 = s1.get(User.class, 1); //Getting User

我知道
Hibernate使用的一级缓存,一旦我们从
会话
中检索到一个实体,对具有相同标识符的同一实体的后续get调用将从
会话
而不是数据库中获取,直到
会话
打开为止

话虽如此,我对hibernate如何将一级缓存与DB同步表示怀疑?考虑下面的场景

//Lets say I have created the session

Session s1 = sessionFactory.getSession();
User u1 = s1.get(User.class, 1); //Getting User with ID=1
//s1 is not yet closed

//Lets say I create some other session

Session s2 = sessionFactory.getSession();
User u2 = s2.get(User.class, 1); //Getting User with ID=1
u2.setName("Abc"); // Changed a field
s2.save(u2); // Saved the changes to DB
s2.close(); //Closed the 2nd session

//Now when I once again retrieve User with ID=1 from s1, will I get updated User?
User u3 = s1.get(User.class, 1);// Here as per my understanding cache is used
所以我的问题是

  • 由于
    u3
    是从一级缓存中获取的,因此
    u3
    是否具有更新的值
  • 如果有人在会话打开时直接更新数据库并修改用户对象,
    会话是否与数据库同步
提前感谢您在此线程上花费的时间和精力

您需要使用
u1
作为参数调用
s1
,以获得新的查找。或者,对于这种情况,您也可以调用
s1
,以获得相同的效果。您还可以调用以刷新
u1的状态


请注意,在提交事务后,其他客户端可能需要一段未定义的时间(通常不会很长)才能看到它们。使用不同连接的其他会话可能无法立即看到此更新。

不,除非您明确请求,否则Hibernate不会将会话缓存中实体的状态与数据库同步

通常这不是问题,因为活动工作通常发生在事务内部,而事务内部的操作不应该看到其他并发事务所做的更改(尽管细节取决于隔离级别)。因此,在本例中,Hibernate的行为补充了事务隔离的典型语义

在某些情况下,还可能需要显式同步实体的状态,以反映在同一事务中所做的更改。这可能是由批量更新查询或执行数据库触发器引起的。在这种情况下,您需要通过调用第一级(会话级)缓存来明确请求这样的同步,以确保持久实例的状态已加载 一个事务所做的更改与其他事务所做的更改相隔离

因此,当您在第一个事务中调用
s1.get(User.class,1)
时,在不同事务(T2)中由
s2
所做的更改不可见,因为这次Hibernate将从会话级缓存
s1
中获取
User