2011-02-01 8 views
3

私はSpring Rooによって生成されたコードを見てきましたが、persist()メソッドの作成方法はPropagation.REQUIRES_NEWです。デフォルトの伝播では十分ではないでしょうか?Spring Rooがpersist()を与える理由Propogation.REQUIRES_NEW

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void Entity.persist() { 
    if (this.entityManager == null) this.entityManager = entityManager(); 
    this.entityManager.persist(this); 
} 

いくつかの追加情報。

// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:02 
project --topLevelPackage org.sotest.sscce --projectName Test --java 6 
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:01:04 
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:06 
persistence setup --database GOOGLE_APP_ENGINE --provider DATANUCLEUS 
entity --class ~.entities.Entity 
exit 
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:02:55 

私はDNプロバイダでGAEデータベースを使用しています。私は単にエンティティを作成しましたが、私は上記のrooコマンドを発行する以外のファイルには触れませんでした。 Entity_Roo_Entity.ajを開くと、上記のコードが表示されます。

私はRooの最新バージョンでこれをもう一度試し、同じ出力を確認します。私はこの問題をRoo関連のフォーラムに掲載する予定です。

更新:同じコードは、Rooの1.1.1(最新版)

答えて

2

SECOND ANSWERで生成されるため、GAEの使用に

それは可能性があります(追加情報は質問に追加されました後)。 GAEデータストアは従来のトランザクションセマンティクスを使用しません。 GAEのトランザクションアイソレーションhereの説明を参照してください。具体的に:

クエリと が トランザクションの開始のようデータストア のシングル、 一貫したスナップショットを見ることが保証されているトランザクション内で取得します。 ...この一貫性のある スナップショットビューは、トランザクション内での書き込み後にも読み取り に拡張されています。 ほとんどのデータベースとは異なり、 というクエリがあり、データストア内に入っています トランザクションは の前回の書き込みの結果を表示していません トランザクション。具体的には、もし エンティティは、修正または削除 トランザクション内で、クエリまたはエンティティは、その後 存在しなかった場合に戻り、元のトランザクションの開始の 、 としてエンティティのバージョンまたは何も 取得されます。

restrictions on querying within a transactionもあります。これを念頭に置いて、おそらくREQUIRES_NEWが追加され、「最初の」トランザクション内のエンティティの後続の読み取りが期待通りに機能するようになります。混乱と非標準的だと思われますが、これはGAEの制約下で作業するときにはおそらく最良の選択です。

最初の答え

は 遊んで誤解または何か他のものが存在する必要があります。私はRoo v1.1.1を確認しました。 は、 Hibernateプロバイダで単純なエンティティを生成し、デフォルトの トランザクションの伝播が使用されています。この もやや documentationで検証されています

すべての永続メソッドは、Springのトランザクションサポート (Propagation.REQUIRED、 Isolation.DEFAULT)で を構成しています。 Propagation.REQUIRES_NEWを使用して

デフォルトは メソッドを持続するために 意味がありません。

私はRooの専門家ではありませんので、 でもこれを行う可能性があると思うこともありません これです。おそらく のコード、特に の非標準構成を投稿する必要があります。ランダム 質問/アイデア:

  1. Hibernateプロバイダを使用していますか?
  2. persisence-unitのカスタム設定はありますか?
  3. エンティティの永続メソッドのすべてについて、伝播.REQUIRES_NEWを参照してください。
  4. どこに伝播注釈が表示されますか。 (例えば で* _Entity.ajはファイル?)
  5. エンティティ・クラス(またはその親の1) は、それが自分の.persist方法(したがって オーバーライドルーの生成方法)のしていることを任意の可能性があります。

    1http://static.springsource.org/spring-roo/reference/html/base-persistence.html

1:ああ。私はそれがGAE/DNプロバイダーの使用による可能性が高いと思います。私はそれに応じて私の答えを変更します。その間、GAEのトランザクション分離についての注釈をここで確認してください:http://code.google.com/appengine/docs/java/datastore/transactions.html

+0

あなたの質問に対処するための説明を追加しました。 GAE/DNに関連している可能性があります。また、Rooバグかもしれません。 REQUIRES_NEWの理由があるかどうかを知りたいのは、他の私の他のプロジェクトに影響を与えるためです。 – Pace

+0

ああ。私はそれがGAE/DNプロバイダーの使用による可能性が高いと思います。私はそれに応じて私の答えを変更します。その間、GAEのトランザクション分離に関する注釈については、http://code.google.com/appengine/docs/java/datastore/transactions.htmlをご覧ください。 – kaliatech

+0

あなたは正しいようです。 GAEは、休止状態とは異なるトランザクション定義を持っています。これは知っておいてよかった、ありがとう。 – Pace

関連する問題