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_Persistence_Persistent_Hibernate Session - Fatal编程技术网

Java Hibernate会话中持久对象的状态

Java Hibernate会话中持久对象的状态,java,hibernate,persistence,persistent,hibernate-session,Java,Hibernate,Persistence,Persistent,Hibernate Session,关于Hibernate,我有一个可能令人尴尬的简单问题: 当我得到一个对象的持久化实例,并且这些对象的某些属性在同一实例中被修改时,这些更改对我来说也是可见的吗 或者我必须对对象进行修改才能获得它的当前状态 我想扩展我的问题:如果这些更改不是在同一个会话中进行的,该怎么办?如果它们是在一个会话中创建的,由同一个会话提供的,该怎么办?不需要刷新,除非它被分离,否则它将是可见的。如果一个实体被加载了两次或更多次(不管是使用Query.list()还是会话.load()),那么总是会得到相同的Jav

关于Hibernate,我有一个可能令人尴尬的简单问题:

当我得到一个对象的持久化实例,并且这些对象的某些属性在同一实例中被修改时,这些更改对我来说也是可见的吗

或者我必须对对象进行修改才能获得它的当前状态



我想扩展我的问题:如果这些更改不是在同一个
会话中进行的,该怎么办?如果它们是在一个
会话中创建的,由同一个会话提供的,该怎么办?

不需要刷新,除非它被分离,否则它将是可见的。

如果一个实体被加载了两次或更多次(不管是使用
Query.list()
还是
会话.load()
),那么总是会得到相同的Java对象实例。由于它是同一个实例,因此无论您在何处使用该实例,该实例的每次修改都是可见的,因此对于未持久化到数据库的修改也是如此(这是一种特定的危险)

如果使用两个不同的会话加载实体两次(会话是否来自同一个SessionFactory并不重要),那么您将得到两个Java类实例。这两个实例是独立的。一个实例没有得到关于另一个实例中修改的通知。如果修改被持久化到数据库中,情况也并非如此。即使再次加载实体并且它已经在会话缓存中,也不会得到修改(例如:
session1.load(实体);session2.save(实体);session1.load(实体);
那么
session1
不会加载
session2
所做的更改,因为实体已经在缓存中)。如果在程序外部直接使用SQL进行修改,情况也是如此。要加载修改,您必须退出实例或使用新会话。在这种情况下,建议使用一个版本化列(使用
子句映射的列)以避免修改的丢失。

另一种情况是:您可以拥有一个具有相同标识的持久实例和一个非持久(或分离?)实例,当您使用后者调用
merge
时,它的任何变化都将在前者中可见。但是,非持久性实例本身并不持久,因此它不会显示将来的任何更改。通常的用法是在合并后丢弃该实例,并改用持久实例。