关于Hibernate,我有一个令人尴尬的简单问题:
当我有一个持久化的对象实例,并且在同一个Session
内修改了这些对象的某些属性时,这些更改是否对我来说也是可见的?
或者我必须refresh
该对象才能获得它的当前状态?
我想扩展一下我的问题:如果这些更改不是在同一Session
内进行的,该怎么办?如果它们是由同一SessionFactory
提供的Session
制作的,那该怎么办?
答案 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)
无需刷新,除非已分离,否则它将可见。