在Hibernate 3上禁用透明持久性

时间:2012-10-05 07:09:43

标签: java hibernate jpa seam

我们正在使用Seam JBoss Seam 2.2.2最终版本,其中包含Hibernate 3.3.1.GA.我们在表上更新了触发器,这样当表上发生更新时,旧记录将记录在历史表中。

我们有一个页面,其中包含填充实体的字段。完成一个字段后,将调用一个AJAX调用方法(在JSF中),根据需要更新实体。问题是,Hibernate将实体视为已更改,并相应地更新数据库表。这会增加历史记录表。我们只使用Hibernate使用JPA实现。

我的问题是:如何在Hibernate中禁用自动更新(称为透明持久性)?我们希望通过调用EntityManager.persist()EntityManager.merge()(在代码中)来明确保存实体。

由于

2 个答案:

答案 0 :(得分:1)

回答您的问题:

在离开方法之前,不要更新方法中的实体或清除实体管理器。

我认为您需要的答案:

不要将每个单独的更改发送到数据库,而是聚合所有更改,并且仅在用户提交更改后更新持久性实体(例如,按钮“保存”或“下一个”或类似的内容)。

答案 1 :(得分:1)

您可以围绕页面创建对话并使用flush-mode="MANUAL"。这有效地禁用了刷新,直到您明确执行它为止(例如,在persist()方法中)。

这样做的缺点是Hibernate必须是你的持久性提供者,因为手动刷新不是标准的JPA 1.0功能。因此Seams知道如何仅在Hibernate中使用它。这至少对于直到2.2.x的Seam版本都是如此。你现在使用Hibernate,所以这应该不是问题。

备选方案:

  1. 在页面上使用DTO对象而不是真实实体对象。将实体克隆到DTO并在持久化之前更新实体。
  2. 使用EntityManager.clear()从会话中分离所有对象。