我在使用手动事务时插入/更新 3 个表。我想在事务提交后立即插入历史表。这意味着em.persist(每个表)有 3 个操作,只有在提交它们之后我才想调用一个方法。
这是我的代码:
@Resource
private EJBContext context;
public void save(Object obj)
{
try
{
transaction = context.getUserTransaction();
transaction.begin();
em.persist(obj);
sb2.save(obj); //persist in sb2
sb3.save(obj); //persist in sb2
transaction.commit();
}
catch (Exception exp)
{
transaction.rollback();
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一种提交后的方法?如何在提交后而不是持久后调用方法?
您可以使用TransactionSynchronizationRegistry注册一个在事务完成后执行的回调:
public class MyListener {
// if you can't inject it with @Resource, you'll have to fetch it from JNDI
@Resource
private javax.transaction.TransactionSynchronizationRegistry registry;
@PostUpdate
public void postUpdate(final Object entity) {
registry.registerInterposedSynchronization(new Synchronization() {
public void beforeCompletion() {}
public void afterCompletion(int status) {
if (status == javax.transaction.Status.STATUS_COMMITTED) {
// Do something with your entity
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
@EntityListeners(MyListener.class)然后用(或将其添加到您的)中注释您的实体orm.xml。
JPA 不提供此类事件,但 EclipseLink 通过 SessionEventListener API 提供扩展事件。
http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/p_session_event_listener.htm
您还可以考虑容器 JTA 事件。
| 归档时间: |
|
| 查看次数: |
6314 次 |
| 最近记录: |