71

オブジェクトをデータベースに保存する EJB があります。私が見た例では、このデータが保存されると (EntityManager.persist)、EntityManager.flush(); が呼び出されます。なぜこれを行う必要があるのですか?保存しようとしているオブジェクトは添付されておらず、後でメソッドで使用されません。実際、保存するとメソッドが返され、リソースが解放されることが期待されます。(コード例では、remove 呼び出しでもこれを行います。)

if (somecondition) {
    entityManager.persist(unAttachedEntity);
} else {
    attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
4

5 に答える 5

59

への呼び出しEntityManager.flush();は、データをデータベースにすぐに永続化することを強制しますEntityManager.persist()(EntityManager の構成方法によって異なります)。基礎となるデータベースへのデータの永続性は、トランザクションがコミットされると遅延します)。

于 2013-07-17T15:21:35.503 に答える
20

このEntityManager.flush()操作は、トランザクションがコミットされる前にすべての変更をデータベースに書き込むために使用できます。デフォルトでは、JPA は通常、トランザクションがコミットされるまで変更をデータベースに書き込みません。これは、必要になるまでデータベース アクセス、リソース、およびロックを回避するため、通常は望ましい方法です。また、最適なデータベース アクセスのためにデータベース書き込みを順序付けてバッチ処理し、整合性の制約を維持してデッドロックを回避することもできます。これは、persist、merge、または remove データベースを呼び出すと、コミットされるまで、またはフラッシュがトリガーされるまで、DML が実行されないINSERTことを意味します。UPDATEDELETE

于 2014-04-09T11:38:08.437 に答える
19

したがって、 を呼び出すとEntityManager.persist()、エンティティが によって管理されるようにEntityManagerなり、それ (エンティティ インスタンス) が に追加されますPersistence Context。Explicitflush()は、現在存在するエンティティPersistence Contextをデータベースに移動します (SQL を使用)。

flush() を使用しないと、関連付けられPersistence ContextているトランザクションPersistence Contextがコミットされたときに、これ (エンティティのデータベースへの移動) が発生します。

于 2015-07-02T13:33:14.497 に答える