当我在session中修改实体时,Hibernate如何检测更改?

3

我想了解Hibernate内部的工作原理。

因此,我在数据库中有一个名为“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();

现在数据库中这个人的姓名已经改为“Joey”。

这是怎么发生的呢?

当我修改了这个人的名字时,Hibernate是如何检测到这些更改的呢?


@SajanChandran,Hibernate 是如何检测到的?何时检测到的? - Joey
这个链接解释了Hibernate如何检测更改并执行适当的查询。 - Sajan Chandran
2个回答

2

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

根据javadoc所述:

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


谢谢,但我想知道Session是如何知道我已经更改了人员的。 - Joey
嗯,我猜Person是一个映射类(与数据库中的PERSON表有关),对吧? - Konstantin Yovkov
这是否意味着当我调用 session.flush 时,session 将检测到更改? - Joey
当你实例化 Person 类时,它与当前的 Session 相关联。当会话刷新时,它将会同步数据库中所有相关类。 - Konstantin Yovkov

1
请注意,您使用了session.get方法(参见文档),这将返回一个持久化实例。
Hibernate会话跟踪持久化实例,并在会话刷新时将更改持久化到数据库。因此,如果您对持久化实例进行更改,则这些更改将在会话刷新时传播到数据库。
通过Session.evict()、Session.clear()和Session.close()调用,持久性实体与会话分离。

你确定session.flush()会对底层数据库做出更改吗?我认为,在flush()之后,更改仍然是未提交的更改,真正的更改将在提交时进行。你可以在commit之后使用SQL命令检查数据库,而不是在commit之前。 - Wundwin Born
这是默认的Hibernate行为,除非在刷新模式中另有规定。http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html - Ashish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接