在事件调用期间与hibernate Session交互

时间:2010-02-18 15:35:40

标签: java hibernate events transactions

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

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

我希望历史行写在同一个事务中,理想情况下使用hibernate(因此使用相同的Session)

我有一些问题/疑虑

  • 我应该挂钩哪些hibernate事件,假设我想捕获只是更改?
  • 如何参与与生成事件的会话相同的会话/事务。我已经读过在事件处理程序中与Session交互的问题了吗?

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

hibernate实体有一个通用的审计解决方案,名为envers,应该可以解决这个问题。

但是,如果此解决方案不够(正如您的评论所示),org.hibernate.events包定义了可用的事件。 在你的情况下,我建议至少实现PostUpdateEventListener接口。

答案 1 :(得分:1)

pre-insertpre-update事件似乎是一个不错的选择。

您的PrePersistEventPreUpdateEventgetSession()方法:

  

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

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

答案 2 :(得分:1)

使用这些事件时,请确保不要触摸导致事件触发的会话。获取会话并检索会话工厂并打开新会话。这仍然是在同一个事务中,但你会避免很多Hibernate问题。

此外,如果您开始遍历导致事件触发的对象上的对象图,那么您可能会因为在刷新期间更改了集合状态而得到奇怪的错误。有这个“bug”的Jira门票。