1

エンティティを永続化するためにトランザクションを使用する必要があるのはなぜですか? 自動コミットするために persistence.xml に追加できるものはありますか?

これは挿入しません:

em.persist(this);

しかし、これは:

em.getTransaction().begin();
em.persist(this);
em.getTransaction().commit();

私の最初の基準点はこのGWT docoだったと思います

public void persist() 
{
   EntityManager em = entityManager();
   try 
   {
     em.persist(this);
   } 
   finally 
   {
     em.close();    
   }  
}
4

2 に答える 2

1

JPAはそのような動作を定義していません。すべての「persist()」は、仕様に従って次のトランザクションまで待機するように定義されています。明らかに、JPAの一部の実装(DataNucleus JPAなど)はその(自動コミット)機能を提供しますが、JPA仕様を超えています(一部ではありません)

于 2012-09-11T06:29:29.163 に答える
1

IMO persistence.xml にそのような設定はありません

このパターンは、接続で autocommit false を設定してから、任意の数のクエリを実行できる JDBC トランザクション管理から採用されたと思います。ただし、接続時にコミットを呼び出さない限り、トランザクションはコミットされません。autocommit が false (デフォルト) の場合、実行された各ステートメントは暗黙的にコミットされ、アトミック操作で実行する必要がある複数のステートメントがある場合、これが発生することは望ましくありません。

あなたの例を挙げると、オブジェクトを永続化すると、そのオブジェクトにはダーティで永続化する必要がある関連付けがある場合があります。そのため、アトミックに実行する必要がある SQL が複数存在します。したがって、上記のトランザクション管理戦略が使用されます。

エンティティ マネージャー (JPA 内) とセッション API (Hibernate 内) は、データベースでの CRUD 操作を抽象化するように設計されています。生成された sql ステートメントを実際にコミットするために、トランザクション API はトランザクション管理の抽象化として設計されています。この個別の抽象化の理由は、トランザクションには通常、リソース ローカル トランザクションと分散トランザクションの 2 つのタイプがあるためだと思います。

リソース ローカル トランザクションは、分散トランザクションとは異なる方法でトランザクション管理インフラストラクチャによって処理される必要があります。リソース ローカル トランザクションでは、データベースに送信されたすべての SQL は、接続時にコミットが呼び出されたときにデータベースによってコミットされるか、接続時にロールバックが呼び出されたときにロールバックされます。分散トランザクション管理では、トランザクション マネージャー コンポーネントは、すべての参加者へのコミットまたはロールバックのシグナリングを管理するコンポーネントです。

JPAでは、トランザクションタイプを次のように言及できます

<persistence-unit transaction-type="RESOURCE_LOCAL  or JTA">
 .................................
</persitence-unit>
于 2012-09-11T04:28:29.670 に答える