【问题标题】:Interacting with the hibernate Session during event calls在事件调用期间与休眠会话交互
【发布时间】:2010-02-18 15:35:39
【问题描述】:

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

我想我可以连接到休眠事件模型并监听告诉我事情何时发生变化的事件,观察我感兴趣的对象类型实例的任何变化,然后让一些自定义代码生成历史记录行.

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

我有一些问题/疑虑

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

任何帮助表示赞赏。

【问题讨论】:

    标签: java hibernate events transactions


    【解决方案1】:

    有一个用于休眠实体的通用审计解决方案,称为 envers,应该可以解决问题。

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

    【讨论】:

    • 谢谢,但我看不到每次更改目标实体都创建“自定义”实体的新实例的方法。它看起来像是一个很好的通用审计系统,但我需要更具体的东西。
    • 谢谢,PostUpdate 活动确实是要走的路。关于如何与 Session/Transaction 交互,我从 envers 源获得了一些好主意。
    【解决方案2】:

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

    您的PrePersistEventPreUpdateEvent 有一个getSession() 方法,即:

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

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

    【讨论】:

    • 不,你不能。它不会保存新对象。
    • 如果你有一个正在运行的事务 - 它应该
    【解决方案3】:

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

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

    【讨论】:

    • 确定新会话在同一个数据库事务中吗?
    猜你喜欢
    • 2011-06-08
    • 2017-11-06
    • 2014-04-23
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多