2013-07-07 85 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註冊回調的事務結束後執行。