如果在一个特定表中插入成功,我必须在2个表(审计表)中插入记录,这是一个非常特殊的要求。这里我不是在讨论监听器中的@PreInsert ,因为监听器总是在同一个事务中被调用。我知道可以通过在第一次保存成功后调用“save”方法手动完成。但我想知道有没有其他方法可以尝试使用Listener,如JPA / EclipseLink / String-data,以便应用程序的未来开发人员不会被迫手动在审计表中插入数据。
基本上我在寻找@PostCommit类型的功能。请帮我。
答案 0 :(得分:0)
我相信你最终做希望回调在当前事务的边界内运行,你只希望它在 Hibernate完成它之后运行,就像Hibernate Envers可以工作。
为此,您基本上需要注册一个事件操作队列回调,如下所示:
session.getActionQueue().registerProcess(
new BeforeTransactionCompletionProcess() {
@Override
public void doBeforeTransactionCompletion(SessionImplementor session) {
// do whatever you want with the session here.
}
}
);
如果你最终必须在交易中运行代码 ,那么你可以做类似的事情:
session.getActionQueue().registerProcess(
new AfterTransactionCompletionProcess() {
@Override
public void doAfterTransactionCompletion(boolean success, SharedSessionContractImplementor session) {
// do whatever you want with the session here.
}
}
);
这应该让你走向任何一个方向。