2

JPAをスタンドアロンモードで実験しています(Hibernateに支えられています)。次のコードは、データベースの値を「文字化け」に変更することに成功していることに気付きました。

A a = em.find(A.class, 1);
a.setA1("garbled");
entityTransaction.begin();   // line 3
entityTransaction.commit();  // line 4
em.close();                 

3 行目より前に他のトランザクションbegin()はありません。EntityTransactionの API 仕様で使用されている言語は、それ以外のことを示しているように見えるか、またはbegin()commit()を使用してJPAエンティティ トランザクションを区別するモデルにおいて、何かが少し直感に反しているのではないでしょうか? 3行目と4行目をコメントアウトしてもデータベースの値は変更されないため、これらの行が必要であることに注意してください。

4

1 に答える 1

3

aこの例では、インスタンスに関連付けられた管理対象エンティティでemあり、トランザクション境界の外側で変更でき、同じエンティティマネージャーインスタンスからのトランザクションのコミットの一部として永続化されます。トランザクション境界は、トランザクションがコミットされたときにデータベースに入力される内容と、トランザクションが失敗したときにDBに加えられた変更が元に戻される内容のみを定義します。例でトランザクションが失敗したとしても、変更が加えられていると仮定するとa、データベースにはこれらの変更がないため、他のユーザーには表示されません。

管理対象エンティティがトランザクション境界の外で変更可能であってはならない、またはトランザクション境界の外でそれらへの変更が永続化されないことを期待していた場合、それは真実ではありません。管理対象エンティティのライフサイクルは、そのエンティティマネージャと結びついています。

于 2012-10-24T11:40:15.760 に答える