我们正在使用Seam JBoss Seam 2.2.2最终版本,其中包含Hibernate 3.3.1.GA.我们在表上更新了触发器,这样当表上发生更新时,旧记录将记录在历史表中。
我们有一个页面,其中包含填充实体的字段。完成一个字段后,将调用一个AJAX调用方法(在JSF中),根据需要更新实体。问题是,Hibernate将实体视为已更改,并相应地更新数据库表。这会增加历史记录表。我们只使用Hibernate使用JPA实现。
我的问题是:如何在Hibernate中禁用自动更新(称为透明持久性)?我们希望通过调用EntityManager.persist()
或EntityManager.merge()
(在代码中)来明确保存实体。
由于
答案 0 :(得分:1)
回答您的问题:
在离开方法之前,不要更新方法中的实体或清除实体管理器。
我认为您需要的答案:
不要将每个单独的更改发送到数据库,而是聚合所有更改,并且仅在用户提交更改后更新持久性实体(例如,按钮“保存”或“下一个”或类似的内容)。
答案 1 :(得分:1)
您可以围绕页面创建对话并使用flush-mode="MANUAL"
。这有效地禁用了刷新,直到您明确执行它为止(例如,在persist()
方法中)。
这样做的缺点是Hibernate必须是你的持久性提供者,因为手动刷新不是标准的JPA 1.0功能。因此Seams知道如何仅在Hibernate中使用它。这至少对于直到2.2.x的Seam版本都是如此。你现在使用Hibernate,所以这应该不是问题。
备选方案:
EntityManager.clear()
从会话中分离所有对象。