0

关于 Hibernate,我有一个可能非常简单的问题:

当我有一个对象的持久实例,并且其中一些对象的属性在相同的内部进行了修改Session时,这些更改对我来说也是可见的吗?

还是我必须要refresh对象才能获得它的当前状态?


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

4

2 回答 2

2

Query.list()如果您有一个实体加载了两次或更多次(无论是否使用或都无关紧要Session.load()),那么您总是会获得相同的 Java 对象实例。因为它是同一个实例,所以无论你在哪里使用这个实例,这个实例的每个修改都是可见的,所以对于没有持久化到数据库的修改也是如此(这是一定的危险)。

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

于 2012-06-26T12:14:38.273 回答
0

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

于 2012-06-26T11:34:19.257 回答