2013-07-07 49 views
3

我使用手动事务插入/更新3个表。我想在事务提交后立即插入历史记录表中。这意味着有3 em.persist动作(对于每个表),并且只有在提交它们之后,我想调用一个方法。jpa @postpersist @postupdate只有在事务提交后

这是我的代码:

@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();   
    } 
} 

有没有什么样的岗位提交方法? 如何在提交之后调用方法,而不是在执行之后调用方法?

回答

0

JPA不提供这样的事件,但EclipseLink通过SessionEventListener API提供扩展事件。

http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/p_session_event_listener.htm

你也可以考虑容器JTA事件。

public class MyListener { 

    @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 
       } 
      } 
     }); 
    } 
} 

然后用@EntityListeners(MyListener.class)注释您的实体(或您的orm.xml添加它):

0

你可以使用TransactionSynchronizationRegistry注册回调的事务结束后执行。