我想编写一个跟踪特定对象类型更改的历史记录组件,并根据差异写入历史记录行。请注意,这不是一个特定于一种对象类型的通用审计系统。
我想我可以挂钩到hibernate事件模型并监听事件,告诉我什么时候发生了变化,监视我感兴趣的对象类型实例的任何更改,然后让一些自定义代码生成历史记录行
我希望历史行写在同一个事务中,理想情况下使用hibernate(因此使用相同的Session)
我有一些问题/疑虑
任何帮助表示感谢。
答案 0 :(得分:2)
hibernate实体有一个通用的审计解决方案,名为envers,应该可以解决这个问题。
但是,如果此解决方案不够(正如您的评论所示),org.hibernate.events包定义了可用的事件。 在你的情况下,我建议至少实现PostUpdateEventListener接口。
答案 1 :(得分:1)
pre-insert
和pre-update
事件似乎是一个不错的选择。
您的PrePersistEvent
和PreUpdateEvent
有getSession()
方法:
此事件的会话事件源。这是生成此事件的基础会话。
因此,使用它,您可以创建新对象并将它们保存在同一会话和事务中。
答案 2 :(得分:1)
使用这些事件时,请确保不要触摸导致事件触发的会话。获取会话并检索会话工厂并打开新会话。这仍然是在同一个事务中,但你会避免很多Hibernate问题。
此外,如果您开始遍历导致事件触发的对象上的对象图,那么您可能会因为在刷新期间更改了集合状态而得到奇怪的错误。有这个“bug”的Jira门票。