2

プロジェクトで Spring Roo 1.2.3 を使用しています。エンティティ Stock が更新されたときに、別のエンティティ X の新しいレコードを作成する必要があります。私はこのようなことをします(データベースのトリガー更新に似ています)。

@PostPersist
@PostUpdate
private void triggerStock() {
    Calendar fechaActual = Calendar.getInstance();      
    Long cantidad = this.getCantidadStock() - this.getCantidadAnterior();

    StockHistory history = new StockHistory();
    history.setArticulo(this.getArticulo());
    history.setFecha(fechaActual);
    history.setCantidad(cantidad);
    history.persist();      
}

アプリケーションがこのメソッドを終了すると、エラーがスローされ、新しい要素 X が保存されません。

しかし、最後の方法を次のように変更すると:

@PostPersist
@PostUpdate
private void triggerStock() {
    Calendar fechaActual = Calendar.getInstance();      
    Long cantidad = this.getCantidadStock() - this.getCantidadAnterior();

    StockHistory history = new StockHistory();
    history.setArticulo(this.getArticulo());
    history.setFecha(fechaActual);
    history.setCantidad(cantidad);

    EntityManagerFactory emf = entityManager().getEntityManagerFactory();
    EntityManager em = emf.createEntityManager();   
    em.getTransaction().begin();
    em.setFlushMode(FlushModeType.COMMIT);      
    em.persist(history);
    em.getTransaction().commit();
    em.close();         
}

これは正常に機能しますが、これが機能するために新しい EntityManager が必要な理由を理解したいのですが?

ありがとう...

4

1 に答える 1

1

PostUpdate はコミット中に呼び出され、永続化ユニットは変更内容と書き込む必要があるものをすでに決定しているため、変更するには遅すぎます (その後、再度書き込む必要があるものを再計算する必要があります)。

使用している JPA プロバイダーによっては、イベントから何かを強制的に書き込む方法がいくつかありますが、注意が必要です。

于 2013-05-30T13:36:30.870 に答える