Hibernate会话中持久对象的状态

时间:2012-06-26 11:28:53

标签: java hibernate persistence persistent hibernate-session

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

当我有一个持久化的对象实例,并且在同一个Session内修改了这些对象的某些属性时,这些更改是否对我来说也是可见的?

或者我必须refresh该对象才能获得它的当前状态?


我想扩展一下我的问题:如果这些更改不是在同一Session内进行的,该怎么办?如果它们是由同一SessionFactory提供的Session制作的,那该怎么办?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

无需刷新,除非已分离,否则它将可见。