关于 Hibernate,我有一个可能非常简单的问题:
当我有一个对象的持久实例,并且其中一些对象的属性在相同的内部进行了修改Session
时,这些更改对我来说也是可见的吗?
还是我必须要refresh
对象才能获得它的当前状态?
我想扩展我的问题:如果这些更改不在同一内部进行Session
怎么办?如果它们是由Session
同一个提供的,该SessionFactory
怎么办?
关于 Hibernate,我有一个可能非常简单的问题:
当我有一个对象的持久实例,并且其中一些对象的属性在相同的内部进行了修改Session
时,这些更改对我来说也是可见的吗?
还是我必须要refresh
对象才能获得它的当前状态?
我想扩展我的问题:如果这些更改不在同一内部进行Session
怎么办?如果它们是由Session
同一个提供的,该SessionFactory
怎么办?
Query.list()
如果您有一个实体加载了两次或更多次(无论是否使用或都无关紧要Session.load()
),那么您总是会获得相同的 Java 对象实例。因为它是同一个实例,所以无论你在哪里使用这个实例,这个实例的每个修改都是可见的,所以对于没有持久化到数据库的修改也是如此(这是一定的危险)。
如果实体使用两个不同的会话加载了两次(会话是否来自同一个 SessionFactory 无关紧要),那么您将获得 Java 类的两个实例。这两个实例是独立的。一个实例未获知另一实例中的修改。如果修改被持久化到数据库中,情况也不是这样。即使您再次加载实体并且它已经在会话缓存中,您也不会得到修改(例如:session1.load(entity); session2.save(entity); session1.load(entity);
然后session1
不会加载 session2
所做的更改,因为实体已经在缓存中)。如果直接在程序外部使用 SQL 进行修改,情况也是如此。要加载修改,您必须evict()
实例或使用新会话。在这种情况下,建议使用版本化列(与<version>
子句映射的列)以避免修改丢失。
不需要刷新,除非它被分离,否则它将是可见的。