Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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 在事件调用期间与hibernate会话交互_Java_Hibernate_Events_Transactions - Fatal编程技术网

Java 在事件调用期间与hibernate会话交互

Java 在事件调用期间与hibernate会话交互,java,hibernate,events,transactions,Java,Hibernate,Events,Transactions,我想编写一个历史组件,用于跟踪对特定对象类型的更改,并根据差异写入历史记录行。注意:这不是一个通用的审计系统,它只针对一种对象类型 我想我可以挂接到hibernate事件模型中,监听事件,这些事件告诉我什么时候事情发生了变化,观察我感兴趣的对象类型实例的任何变化,然后让一些自定义代码生成历史记录行 我希望在同一事务中写入历史记录行,最好使用hibernate(因此使用相同的会话) 我有一些问题/顾虑 假设我只想捕获更改,我应该钩住哪些休眠事件 如何开始参与与生成事件的会话相同的会话/事务。我已

我想编写一个历史组件,用于跟踪对特定对象类型的更改,并根据差异写入历史记录行。注意:这不是一个通用的审计系统,它只针对一种对象类型

我想我可以挂接到hibernate事件模型中,监听事件,这些事件告诉我什么时候事情发生了变化,观察我感兴趣的对象类型实例的任何变化,然后让一些自定义代码生成历史记录行

我希望在同一事务中写入历史记录行,最好使用hibernate(因此使用相同的会话)

我有一些问题/顾虑

  • 假设我只想捕获更改,我应该钩住哪些休眠事件
  • 如何开始参与与生成事件的会话相同的会话/事务。我已经读到在事件处理程序中与会话交互时存在问题

非常感谢您的帮助。

有一个针对hibernate实体的通用审计解决方案,名为,应该可以做到这一点

但是,如果这个解决方案还不够(如您的评论所示),那么包将定义可用的事件。
在您的情况下,我建议至少实现PostUpdateEventListener接口。

预插入和
预更新
事件似乎是一个不错的选择

您的
prepersistent
PreUpdateEvent
有一个
getSession()
方法,该方法是:

此事件的会话事件源。这是生成此事件的基础会话


因此,使用它,您可以创建新对象并将它们保存在同一会话和事务中。

使用这些事件时,请确保您不接触导致事件触发的会话。获取会话并检索会话工厂并打开新会话。这仍将在同一事务中,但您将避免许多Hibernate问题


此外,如果您开始遍历导致事件触发的对象上的对象图,则在刷新期间更改集合状态时可能会出现奇怪的错误。对于这个“bug”,有Jira的票证可供选择。

谢谢,但我看不到一种方法可以让每个目标实体的更改都创建一个“自定义”实体的新实例。这看起来是一个很好的通用审计系统,但我需要一些更具体的东西。谢谢,PostUpdate事件确实是一个不错的选择。关于如何与会话/事务交互,我从envers源代码中获得了一些好主意。不,你不能。它不会保存新对象。如果您有一个正在运行的事务,它应该确定新会话是否在同一个数据库事务中?