【问题标题】:How does hibernate detects the changes when I have modified the entity in session [closed]当我在会话中修改实体时,休眠如何检测更改[关闭]
【发布时间】:2014-07-07 04:59:24
【问题描述】:

我想知道 Hibernate 内部是如何工作的。

所以,我在 DB 里有个叫“Peter”的人;

Session session = SessionFactory.openSession();
Person p = session.get(Person.class, 1);//Peter's id is 1
System.out.println(p.getName());//output : Peter
p.setName("Joey");
session.flush();
session.close();

现在这个人在 DB 中的名字已更改为“Joey”。

这是怎么发生的?

当我更改此人的姓名时。 hibernate 是如何检测到这些变化的?

【问题讨论】:

  • @SajanChandran 怎么样,hibernate 什么时候检测到的?
  • 此链接解释了howhibernate 检测更改并执行适当的查询。

标签: java hibernate


【解决方案1】:

Session#flush() 方法使当前会话中的数据与数据库中的数据同步。

根据javadoc:

刷新是同步底层持久化的过程 存储在内存中的可持久状态。

【讨论】:

  • 谢谢,但我想知道 Session 怎么知道我换了人
  • 好吧,我猜Person 是一个映射类(与db 中的PERSON 表相关),不是吗?
  • 这是否意味着当我调用 session.flush 时,会话会检测到更改?
  • 当您实例化Person 类时,它与当前的Session 相关联。当会话刷新时,它会将数据库与所有关联的类同步。
【解决方案2】:

请注意,您使用了 session.get 方法(参考doc),这反过来又返回了一个持久实例,

持久化实例由 Hibernate 会话跟踪,并在会话刷新时将更改持久化到数据库中。因此,如果您对持久实例进行了更改,这些更改将在会话刷新时传播到数据库

持久实体通过 Session.evict()、Session.clear() 和 Session.close() 调用与会话分离。

【讨论】:

  • 您确定session.flush() 会更改底层数据库吗?我认为,在flush() 之后,更改仍然是未提交的更改,而真正的更改将在提交时进行。您可以在 flush 之后使用 SQL 命令检查 db,但不能在 commit 之前。
  • 这是默认的休眠行为,除非在刷新模式中另有指定docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/…
猜你喜欢
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多