代码之家  ›  专栏  ›  技术社区  ›  Mike Q

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

  •  4
  • Mike Q  · 技术社区  · 14 年前

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

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

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

    我有一些问题/担心

    • 假设我只想捕获更改,应该挂接哪些休眠事件?
    • 如何在生成事件的会话中加入相同的会话/事务。我读过与事件处理程序内部的会话交互有问题吗?

    感谢任何帮助。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Riduidel    14 年前

    有一个针对hibernate实体的通用审计解决方案,称为 envers ,这应该能起到作用。

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

        2
  •  1
  •   Bozho    14 年前

    这个 pre-insert pre-update 事件似乎是个不错的选择。

    你的 PrePersistEvent PreUpdateEvent 有一个 getSession() 方法是:

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

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

        3
  •  1
  •   Kango_V    14 年前

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

    另外,如果开始遍历导致事件触发的对象上的对象图,那么在刷新期间更改了集合状态时,可能会出现奇怪的错误。这张“臭虫”的吉拉票还开着。