51

データベースを更新するときに何を好むべきですか?どちらの方法の長所と短所は何ですか?どちらをいつ使用しますか?

public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    employee.getPeriod().setEndDate(endDate);
    em.flush();
}

public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    em.getTransaction().begin();
    employee.getPeriod().setEndDate(endDate);
    em.getTransaction().commit();
}
4

5 に答える 5

54

最初の例では、データへの変更はフラッシュに遭遇した後にデータベースに反映されますが、それはまだトランザクション中です。

しかし、2番目の例では、トランザクションをすぐにコミットしています。したがって、変更はデータベースに加えられ、トランザクションもそこで終了します。

場合によっては、フラッシュは、進行中のトランザクションの間にデータを永続化し、その後、最終的に変更をコミットするのに役立つことがあります。したがって、バッチ挿入/更新など、後で問題が発生した場合は、以前の変更をロールバックすることもできます。

于 2012-06-15T10:17:45.227 に答える
18

フラッシュとコミットのjavadocを読み、フラッシュがトランザクション内でのみ使用されることを知っていますか?フラッシュします(ただしコミットしません)が、commitはデータをコミットします(明らかに)。それらは明確です。持つべき「好み」はありません。最初の例は間違っており、flushの呼び出し時に例外が発生するはずです(TransactionRequiredException)

于 2012-06-15T09:52:13.000 に答える
4

両方のコードサンプルは、DBに書き込まれるエンティティの状態を永続化またはマージしません。

EntityManager.flush()とを比較するのは適切ではないと思いますEnityManager.EntityTransaction.commit()

flush()はトランザクションコンテキストで囲まれている必要があり、EntityTransaction.commit()が自動的に行う場合は、必要な場合を除いて(まれに)明示的に行う必要はありません。

このリンクを参照してくださいこの状況でflush()(JPAインターフェース)を呼び出す必要がありますか?

このリンクを参照してください。flush()を使用するシナリオでクエリが呼び出される前のJPAによるフラッシュに関する質問

于 2012-06-15T09:58:49.580 に答える
0

可能な限り、コンテナ管理のトランザクションを使用します。Beanで管理されるトランザクションは、例外の可能性があるため、通常、かなり多くのコードを必要とします。また、エラーが発生しやすくなります(ロールバック、リソース管理)。

そうは言っても、コンテナ管理モードでのコミット後にフラッシュを使用します。そうすることで、ストレージモジュールで発生する可能性のあるPersistenceExceptionをキャッチし、ユースケースモジュールにとってより意味のある例外に変換できます。これは、ここでストレージ固有の例外を処理したくないためです。これは、ストレージモジュールをJPAを使用しないものと交換する可能性があるためです...これは私には起こりませんでした:)

于 2014-01-17T19:51:19.767 に答える
0

不足している部分は、flush()がデータソースに追加してコミットできるようにするだけで、実際のIDを提供しますが、デフォルトでは保持されないと思います。

したがって、commit()として機能するためにflush()が必要な場合は、次の方法でEntityManagerでフラッシュモードをCommitに設定する必要があります。

void setFlushMode(FlushModeType flushMode)
Set the flush mode that applies to all objects contained in the persistence context.

FlushModeTypeは、次の2つの値を持つ列挙型であることに注意してください。

FlushModeType AUTO(デフォルト)クエリの実行時に発生するフラッシュ。以来:JPA 1.0FlushModeTypeCOMMITトランザクションのコミット時に発生するフラッシング。プロバイダーは他の時間にフラッシュする場合がありますが、フラッシュする必要はありません。以来:JPA 1.0

この助けを願っています

于 2015-06-22T08:29:16.337 に答える