2011-06-23 6 views
5

メソッド内でトランザクションを必要とするメソッドを呼び出すことはできますか?メソッドの@TransactionAttribute(value = TransactionAttributeType.NEVER)の使用

@TransactionAttribute(value = TransactionAttributeType.NEVER) 
public void DoSomething(final List<Item> items) { 

//can you call a method that requires a transaction here ? 
for (Item i : items) { 
    methodCall(item); 

} 

@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
public void methodCall(final Item item) { 
    // access lazily loaded item properties 
    item.getSalesOrder(); 
    item.getAllocation(); 

    //throws org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

} 

.NEVER属性は、それがその方法

+0

@TransactionAttributeアノテーションをクラスレベルで適用して、エンタープライズBeanのすべてのビジネスメソッドのデフォルトのトランザクション属性を指定することができます。この注釈をメソッドレベルで適用して、そのメソッドのトランザクション属性を指定することができます。アノテーションをメソッドレベルで適用すると、そのメソッドのクラスレベルアノテーション(存在する場合)がオーバーライドされます。 – Luke

答えて

9

注釈がときにのみ存在している必要があります必要なトランザクション状態を定義内の他のメソッドの呼び出しについてのトランザクション内で実行されません方法が、何を保証すると言います注釈付きメソッドが呼び出されます(この場合、トランザクションは存在してはいけません)。アノテーションメソッドの実行中に何が起こるかは制限されません。この方法では、問題なく新しいトランザクションを開始することができます。

指定した例では、トランザクション設定がNEVERのメソッド内からトランザクションが必要なメソッドを呼び出すことができます。この状況では、トランザクションを必要とするメソッド呼び出しに対して新しいトランザクションが作成されます。内部メソッドにMANDATORY設定が設定されている場合、既存のトランザクションが存在しないため内部メソッド呼び出しが失敗し、必須設定で自動的に作成されません。

+0

これをクリアしていただきありがとうございます。私はそれが動作しない理由は何も見えませんでしたが、内側のメソッド呼び出しの中に遅延ロードされたプロパティにアクセスすることができません(新しいものが必要なアノテーションが付いていても) – Luke

+0

トップレベルのBeanは内部Bean ')? 'itemBean'コンテナも管理されているのですか、それとも直接インスタンス化しましたか(トランザクション注釈はマネージドBeanでのみサポートされています)また、あなたが参照している遅延ロードされたプロパティは何ですか?それらはトランザクションにどのように関連していますか? –

+0

各アイテムには、遅延が発生しているセールスオーダーと割り当て、およびこの特定のトランザクションと無関係のその他のプロパティがあります。この場合、両方のメソッドが同じBean上にあるので、私のコード例はitemBeanプレフィックスを持つべきではありません。 – Luke

関連する問題