【发布时间】: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