我知道一个事实,它[Session](http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/Session.html)是 Hibernate 使用的一级缓存,一旦我们从中检索到一个实体session,便会从而不是从DB中获取具有 相同标识符 的 同一实体 的后续get调用,直到is Open 为止。 session``session
[Session](http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/Session.html)
session
session``session
话虽如此,我对hibernate如何将第一级缓存与数据库同步感到怀疑吗?考虑以下情形
//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
预先感谢您在此线程上花费的时间和精力
不,除非您明确要求,否则Hibernate不会做任何事情来将会话缓存中的实体状态与数据库同步。
通常这不是问题,因为活动工作通常发生在事务内部,并且事务内部的操作不应该看到其他并发事务所做的更改(但是细节取决于隔离级别)。因此,在这种情况下,Hibernate的行为补充了事务隔离的典型语义。
在某些情况下,需要明确同步实体的状态以反映同一事务内部所做的更改。这可能是由于批量更新查询或执行数据库触发器引起的。在这种情况下,您需要通过调用显式请求这种同步refresh()。
refresh()