如何用纯JPA实现历史表?

发布于 2024-11-02 17:03:04 字数 205 浏览 0 评论 0原文

我需要将一个“entity_name”更改为另一个名为“entity_name_history”的日志表,而不使用任何 JPA 提供程序(我必须更改不使用 JPA 提供程序的现有项目)。我想知道的是无论如何可以在纯 JPA 中实现历史记录。

我一直在研究一些持久事件拦截,例如@postUpdate,但据我所知,我不能在这些回调中使用entitymanager,如果可以请告诉我。

I need to keep change of one "entity_name" into another log table called "entity_name_history" without using any JPA provider (I have to change existing project which doesn't use one). What I want to know is there anyway to implement history in pure JPA.

I have been looking into some persistent event intercept like @postUpdate, but from what I know I can't use entitymanager in those callback, if it can please tell me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南笙 2024-11-09 17:03:04

最简单、最干净的解决方案是使用数据库触发器来实现历史功能。

The easiest and most clean solution is using database triggers to implement history feature.

别闹i 2024-11-09 17:03:04

关于这个主题有大量文献,尽管它通常被称为“实体审计”。 Hibernate 提供了一个名为 Hibernate Envers 的模块,专门为此构建,并且显然使用了这种 JPA 触发器。

还有一个(好?)关于实现的教程它使用 TopLink(现在是 EclipseLink)。

所以,是的,这就是这样做的方法,但是,不,你不应该自己这样做。

There is an abundant litterature about that subject, although it's usually called "entity auditing". Hibernate provides a module, called Hibernate Envers, specially built for that, and obviously using that kind of JPA triggers.

There is also a (good?) tutorial on implementing it using TopLink (now EclipseLink).

So, yes, that's the way to do, but, no, you shouldn't do it by yourself.

夢归不見 2024-11-09 17:03:04

我觉得可以用,只是要小心使用。以下是 JPA 规范的引用:

一般来说,可移植应用程序不应调用 EntityManager 或查询操作,
访问其他实体实例,或修改生命周期回调方法中的关系。

作为替代方案,您可以使用不同的实体管理器或使用位于同一事务中的纯 JDBC 数据源连接。特别是,如果您不需要在同一 JPA 会话中对历史对象进行任何操作。

I think it can be used, just it has to be used with care. Here is quote from JPA specification:

In general, portable applications should not invoke EntityManager or Query operations,
access other entity instances, or modify relationships in a lifecycle callback method.

As an alternative you can use different entity manager or use pure JDBC data source connection that will live in the same transaction. Especially, if you don't need to do any manipulations with your history objects in the same JPA session.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文