使用 Hibernate 实体中的现有数据填充 envers 修订表
我正在将 envers 添加到现有的休眠实体中。 就审计而言,一切都进展顺利,但是查询是一个不同的问题,因为修订表没有填充现有数据。 还有其他人已经解决了这个问题吗? 也许您已经找到了用现有表填充修订表的方法? 只是想我会问,我相信其他人会发现它有用。
I'm adding envers to an existing hibernate entities. Everything is working smoothly so far as far as auditing, however querying is a different issue because the revision tables aren’t populated with the existing data. Has anyone else already solved this issue? Maybe you’ve found some way to populate the revision tables with the existing table? Just thought I’d ask, I'm sure others would find it useful.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我们通过运行一系列原始 SQL 查询来模拟“插入”所有现有实体来填充初始数据,就好像它们刚刚同时创建一样。 例如:
请注意,REVTYPE 值为 0 表示插入(而不是修改)。
We populated the initial data by running a series of raw SQL queries to simulate "inserting" all the existing entities as if they had just been created at the same time. For example:
Note that the REVTYPE value is 0 to indicate an insert (as opposed to a modification).
如果您使用 Envers ValidityAuditStrategy 并拥有在启用 Envers 的情况下创建的数据。
在我们的例子中(Hibernate 4.2.8.Final),基本对象更新会抛出“无法更新实体的先前版本”(记录为 [org.hibernate.AssertionFailure] HHH000099)。
我花了一段时间才找到这个讨论/解释,所以交叉发布:
没有审计记录的 ValidityAuditStrategy< /a>
You'll have a problem in this category if you are using Envers ValidityAuditStrategy and have data which has been created other than with Envers enabled.
In our case (Hibernate 4.2.8.Final) a basic object update throws "Cannot update previous revision for entity and " (logged as [org.hibernate.AssertionFailure] HHH000099).
Took me a while to find this discussion/explanation so cross-posting:
ValidityAuditStrategy with no audit record
你不需要。
AuditQuery 允许您通过以下方式获取 RevisionEntity 和数据修订:
这将构造一个返回对象列表的查询 [3]。 第一个元素是您的数据,第二个元素是修订实体,第三个元素是修订类型。
You don't need to.
AuditQuery allows you to get both RevisionEntity and data revision by :
This will construct a query which returns a list of Object [3]. Fisrt element is your data, the second is the revision entity and the third is the type of revision.
我们已经解决了用现有数据填充审核日志的问题,如下所示:
我的数据源的配置(通过 Spring):
拦截器:
ps:请记住,这是一个简化的示例。 它不会开箱即用,但会引导您找到可行的解决方案。
We have solved the issue of populating the audit logs with the existing data as follows:
The configuration of my data sources (via Spring):
The interceptor:
ps: keep in mind that this is a simplified example. It will not work out of the box but it will guide you towards a working solution.
您可以使用 find 方法的后备选项来扩展
AuditReaderImpl
,例如:在某些情况下,您可以在返回
null
方面添加更多检查。您可能还想使用自己的工厂:
You could extend the
AuditReaderImpl
with a fallback option for the find method, like:You could add a few more checks in terms of returning
null
in some cases.You might want to use your own factory as well:
看看 http://www.jboss.org/files/ envers/docs/index.html#revisionlog
基本上,您可以使用 @RevisionEntity 注释定义自己的“修订类型”,
然后实现 RevisionListener 接口来插入额外的审核数据,
比如当前用户和高级操作。 通常这些是从 ThreadLocal 上下文中提取的。
Take a look at http://www.jboss.org/files/envers/docs/index.html#revisionlog
Basically you can define your own 'revision type' using @RevisionEntity annotation,
and then implement a RevisionListener interface to insert your additional audit data,
like current user and high level operation. Usually those are pulled from ThreadLocal context.
我检查了很多方法,但对我来说最好的方法是编写一个 PL/SQL 脚本,如下所示。
下面的脚本是为 PostgreSQL 编写的。 没有检查其他供应商,但他们必须具有相同的功能。
I've checked many ways, but the best way for me is to write a PL/SQL script as below.
The below script is written for PostgreSQL. Didn't check other vendors, but they must have the same feature.