【问题标题】:Preserving entire JPA entity on each change在每次更改时保留整个 JPA 实体
【发布时间】:2015-05-25 20:23:48
【问题描述】:

我正在开发一个带有 Hibernate 后端的应用程序。我希望它能够做的一件事是让异步事件处理程序在 JPA 实体对象更新时触发。棘手的部分是,一旦更新了 JPA 实体,就不再有对原始对象的任何持久引用。

最终目标是存储原始的更新的实体,以便异步组件可以看到它们的整体。我可以想出几种可能的方法来解决这个问题,但它们都让我觉得很复杂。

  • 序列化原始对象,将其存储在数据库中的某处,并异步引用它
  • 序列化更新后的对象,作为 JMS 消息发送,异步更新数据库
  • 创建单独的审核对象以跟踪更改并重放它们

这种事情有更简单的模式吗?或者这只是我应该接受复杂性的东西?

【问题讨论】:

  • 不确定您是否已经尝试过 JPA PreUpdate 和 PostUpdate 回调 - 只需将对象的状态保存在每个回调中即可。另外,在我看来,像 Hibernate Envers 这样的东西可能会很方便,在这种情况下,你有一个日志记录每个对象的变化docs.jboss.org/envers/docs
  • 我对那些回调很熟悉,但是你如何“保存状态”呢?在某个地方,您必须将预先更新的实体(关系和所有)的全部内容与当前实体一起保存。这就是我希望有一个共同模式或工具的部分。
  • 对于我们的系统,我们使用您的第一个想法:“序列化原始对象,将其存储在数据库中的某个位置......”假设我们有一个 PERSON_NAME 表。当一个人的名字改变时,我们使用一个标志在表中“停用”他们的名字并添加新的名字记录。因此,我们将历史对象与活动对象存储在同一个表中,并使用标志来区分它们。它工作正常。我不知道更简单的模式,但我没有经验。就我个人而言,我将仔细研究 Hibernate Envers——谢谢,@sap1ens。
  • @sap1ens 我给了 Hibernate Envers 一个机会,到目前为止它非常棒。如果您将其添加为答案,我会接受!
  • 酷,刚刚做到了:)

标签: java hibernate jpa orm audit


【解决方案1】:

在我看来,Hibernate Envers 可能很方便,在这种情况下,您有一个记录每个对象更改的日志http://docs.jboss.org/envers/docs/

【讨论】:

    【解决方案2】:

    Audit4j 将有助于异步持久化您的对象。但它不会为 JPA 对象更改提供内置支持。但可能有一种解决方法来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-05
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多