Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用纯JPA实现历史表?_Java_Jpa_History - Fatal编程技术网

Java 如何用纯JPA实现历史表?

Java 如何用纯JPA实现历史表?,java,jpa,history,Java,Jpa,History,我需要在不使用任何JPA提供程序的情况下将一个“entity_name”的更改保存到另一个名为“entity_name_history”的日志表中(我必须更改不使用的现有项目)。我想知道的是,在纯JPA中是否有实现历史的方法 我一直在研究一些持久性事件截获,比如@postUpdate,但据我所知,如果可以的话,我不能在这些回调中使用entitymanager。最简单、最干净的解决方案是使用数据库触发器来实现历史记录功能 我认为它是可以使用的,只是必须小心使用。以下是JPA规范的引用: 通常,可移

我需要在不使用任何JPA提供程序的情况下将一个“entity_name”的更改保存到另一个名为“entity_name_history”的日志表中(我必须更改不使用的现有项目)。我想知道的是,在纯JPA中是否有实现历史的方法


我一直在研究一些持久性事件截获,比如@postUpdate,但据我所知,如果可以的话,我不能在这些回调中使用entitymanager。

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

我认为它是可以使用的,只是必须小心使用。以下是JPA规范的引用:

通常,可移植应用程序不应调用EntityManager或查询操作, 访问其他实体实例,或在生命周期回调方法中修改关系


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

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

还有一个关于(现在是EclipseLink)的(好的?)教程


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

你确实有一个JPA提供商。没有“纯jpa”这样的东西——始终需要提供程序。也许它捆绑在您的应用程序服务器中?@Bozho,我猜他的意思是他想要一个可以与任何JPA提供商一起使用的解决方案。@Andrey Adamovich“不使用一个”让我相信他认为没有提供商。@Bozho有办法找出JPA提供商使用的是什么。据我所知,它是由新的EJB项目通过EclipseBlue接口创建的(我没有看到任何jpa提供程序选择)。你在使用app Server吗?我个人的观点是反对数据库触发器、存储过程等等。这通常是一个维护问题。嗯,我也反对数据库特定的事情,但这是另一种情况,问题定义明确,解决方案非常简单。@Bozho我们几乎所有的数据库访问都是通过存储过程进行的,存储过程也会更新历史记录表。这就是我们团队中有数据库开发人员的原因。我个人认为,与我们的其他数据源(如soap服务)相比,这为软件提供了一个很好的额外接口层。但是仅仅为此触发在维护中可能确实很麻烦,问题是如何用纯JPA实现。