3

我们正在使用 Seam JBoss Seam 2.2.2 Final Release,其中包含 Hibernate 3.3.1.GA。我们在表上设置了更新触发器,这样,当表上发生更新时,旧记录会记录在历史表中。

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

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

谢谢

4

2 回答 2

1

回答你的问题:

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

我认为你需要的答案:

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

于 2012-10-05T09:10:18.620 回答
1

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

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

备择方案:

  1. 在页面上使用 DTO 对象而不是真实的实体对象。将实体克隆到 DTO 并在持久化之前更新实体。
  2. 用于EntityManager.clear()从会话中分离所有对象。
于 2012-10-05T10:13:46.867 回答