2

我有一个托管bean,其中包含当前页面的实体对象列表。在我创建一个新对象并在事务中使用 persist() 将其持久化到数据库之后;在我调用合并时的另一个事务中(因为实体由于先前的事务提交而处于分离状态);entitymanager 无法在持久性上下文中找到对象并向数据库抛出选择查询。我错过了什么还是这是正常行为?

更新:当我使用 mysql 数据库和自动生成的 Id 列时,存在上述问题。当我使用 Oracle 时,它​​不存在,我使用序列作为 Ids;但仍然;持久化上下文应该知道生成的 id;还有什么方法可以查看持久性上下文以查看哪些实体存在;我正在使用休眠顺便说一句

4

2 回答 2

1

这是正常的行为。默认情况下,持久性上下文具有与事务相同的生命周期。这是完全正常的:一旦事务提交,其他事务可能会修改实体,Hibernate 必须从数据库中重新加载实体以确保它不会返回过时的值。

于 2012-11-02T08:12:54.620 回答
1

这是正常行为。如果实例不在持久化上下文中,它需要知道它是否存在(应该被覆盖或稍后新创建)。

ID 生成:生成的 ID 通常在调用 persist(..) 时返回,非常方便,因此您的应用程序可以立即使用新创建的 ID,无需等待事务结束。

您可以通过调用检查给定对象是否在持久性上下文中: https ://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#contains%28java.lang.Object%29

于 2012-11-02T08:13:32.673 回答