2016-11-23 10 views
1

私は@ Transactionメソッドを持つSpring beanを持っています。Spring @Transactionalアノテーションの厳密な代替方法

public class ABean{ 
    @Transactional 
    public void method aMethod(){ 
    //do some job with Hibernate. 
    } 
} 

しかし、今、私は(実際にはクォーツの文脈における)Springコンテキストではないと呼ばれるべき別のメソッドからこのメソッドを呼び出す必要があります:私は、アノテーション@Transactionalだけで何とかメソッドをラップ理解したよう

public class ABean implements org.quartz.Job{ 

    @Transactional 
    public void method aMethod(){ 
    //do some job with Hibernate. 
    } 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
    System.out.println("start..."); 
    //@Transactional annotation is ignored here 
    //so I have 'Could not obtain transaction-synchronized Session 
    //for current thread' exception. 
    aMethod(); 
    System.out.println("done"); 
    } 
} 

いくつかの別のコード。では、SpringコールのようにaMethod()コールをどのようにラップする必要がありますか?

+0

同じクラス内のメソッドで[Spring @ Transactionメソッド呼び出しが重複している可能性がありますか?](http://stackoverflow.com/questions/3423972/spring-transaction-method-call-by-the-同じクラスのメソッドではありません) –

答えて

1

Springは、別のBeanから呼び出したときにトランザクションロジックを追加するだけです。同じクラスからメソッドを呼び出すと、アノテーションは無視されます。

これは、aMethod()を別のBeanに移動し、既存のABeanから呼び出す必要があることを意味します。

2

このメソッドは、Spring管理環境では実行されず、文法的に使用されるため、Hibernateからのトランザクションを代わりに使用できます。 Hibernate SessionFactoryからSessionオブジェクトを作成します。 Sessionから、session.beginTransaction()を使用してTransactionを取得できます。 チェックアウト: Hibernate Docs

+0

私はこの方法で試していませんでしたが、あなたの答えはあまりにもうまくいくように見えます。ありがとうございました。 –

関連する問題