java - Hibernate 一级缓存 - 它同步吗?

标签 java hibernate jpa hibernate-session

我知道 <a href="http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/Session.html" rel="noreferrer noopener nofollow">Session</a>Hibernate 使用的一级缓存,一旦我们从 session 检索实体,随后对具有相同标识符相同实体的get调用是从session中获取的而不是 DB,直到 session 打开

话虽如此,我对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有更新值?
  • 如果有人在 session 打开时直接更新数据库并修改用户对象,session与数据库同步?

在此先感谢您为此主题付出的时间和精力

最佳答案

不,Hibernate 不会做任何事情来将 session 缓存中实体的状态与数据库同步,除非您明确请求。

通常这不是问题,因为 Activity 工作通常发生在事务内部,并且事务内部的操作不应该看到其他并发事务所做的更改(不过细节取决于隔离级别)。因此,在这种情况下,Hibernate 的行为补充了事务隔离的典型语义。

在某些情况下,实体的状态需要显式同步以反射(reflect)同一事务内所做的更改。它可能是由批量更新查询或执行数据库触发器引起的。在这种情况下,您需要通过调用 refresh() 显式请求此类同步。

关于java - Hibernate 一级缓存 - 它同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18721634/

相关文章:

java - 当对象初始化时调用方法

hibernate - 使用 hibernate 将 blob 保存到数据库

java - GORM 属性和 Postgres 字段是域数据类型

java - 使用 JPA 和 BeansBinding 时保存数据

java - 如何将EntityManager注入(inject)到Spring Integration bean中?

java - 有没有办法打印JDBC执行的所有SQL语句?

java - JButton自定义问题

java - 已弃用 : Hibernate setHint

hibernate - 如果多列约束之一为空,则Hibernate `unique`约束不起作用

java - 一台机器可以使用Java中的socket同时充当客户端和服务器吗?