san*_*hat 5 java hibernate jpa hibernate-session
我知道这Session是Hibernate使用的一级缓存这一事实,一旦我们从 中检索实体session,对于具有相同标识符的同一实体的后续 get 调用将从而不是从 DB 中获取,直到是Open。sessionsession
话虽如此,我对休眠如何将一级缓存与数据库同步有疑问?考虑以下场景
//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
Run Code Online (Sandbox Code Playgroud)
所以我的问题是
u3是从一级缓存中获取的,是否u3有更新的值?session与数据库同步?预先感谢您在此线程上花费的时间和精力
不,Hibernate 不会执行任何操作来将会话缓存中的实体状态与数据库同步,除非您明确请求。
通常这不是问题,因为活动工作通常发生在事务内部,并且事务内部的操作不应该看到其他并发事务所做的更改(但详细信息取决于隔离级别)。因此,在这种情况下,Hibernate 的行为补充了事务隔离的典型语义。
在某些情况下,实体的状态需要显式同步以反映同一事务内所做的更改。它可能是由批量更新查询或数据库触发器的执行引起的。在这种情况下,您需要通过调用显式请求此类同步refresh()。