Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我在会话中修改实体时,hibernate如何检测更改_Java_Hibernate - Fatal编程技术网

Java 当我在会话中修改实体时,hibernate如何检测更改

Java 当我在会话中修改实体时,hibernate如何检测更改,java,hibernate,Java,Hibernate,我想知道Hibernate内部的工作原理 我在DB有一个人叫“彼得” 现在这个人在DB里的名字改成了“乔伊” 那是怎么发生的 当我改变了那个人的名字。hibernate是如何检测到更改的?该方法使当前会话中的数据与数据库中的数据同步 根据javadoc: 刷新是同步底层持久化进程的过程 存储在内存中的持久状态 请注意,您使用了方法session.get(请参阅),这将返回一个持久实例 Hibernate会话跟踪持久实例,并在会话刷新时将更改持久化到数据库。所以,若您对持久实例进行了更改,那个么这

我想知道Hibernate内部的工作原理

我在DB有一个人叫“彼得”

现在这个人在DB里的名字改成了“乔伊”

那是怎么发生的

当我改变了那个人的名字。hibernate是如何检测到更改的?

该方法使当前会话中的数据与数据库中的数据同步

根据javadoc:

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


请注意,您使用了方法session.get(请参阅),这将返回一个持久实例

Hibernate会话跟踪持久实例,并在会话刷新时将更改持久化到数据库。所以,若您对持久实例进行了更改,那个么这些更改将在会话刷新时传播到数据库


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

谢谢,但是我想知道Session怎么知道我已经更改了personWell,我猜
Person
是一个映射类(与数据库中的
Person
表相关),不是吗?这是否意味着当我调用Session.flush时,Session将检测到更改?当您实例化
Person
类时,它与当前的
会话关联。会话刷新时,它会将数据库与所有关联的类同步。@SajanChandran hibernate是如何检测到的?此链接解释hibernate检测到更改并执行适当的查询。是否确定
session.flush()
进行基础数据库更改?我认为,在
flush()
之后,更改仍然是未提交的更改,真正的更改将在提交时进行。您可以在
flush
之后,但不能在
commit
之前,使用SQL命令检查数据库。除非在flush模式中另有规定,否则这是默认的休眠行为
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();