3

手動トランザクションの使用中に 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();        
    }   
 }

コミット後の方法はありますか?永続化後ではなく、コミット後にメソッドを呼び出すにはどうすればよいですか?

4

3 に答える 3

2

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

次に、エンティティに注釈を付けます@EntityListeners(MyListener.class)(または に追加しますorm.xml)。

于 2016-09-23T08:24:32.063 に答える
0

JPA はそのようなイベントを提供しませんが、EclipseLink は SessionEventListener API を介して拡張イベントを提供します。

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

コンテナ JTA イベントも検討できます。

于 2013-07-08T13:46:52.490 に答える