2016-11-23 114 views
1

我有@Transactional方法的Spring bean。Spring @Transactional註釋的嚴格替代

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

但現在我需要(實際上是在石英上下文)調用從不應在Spring上下文中被稱爲另一種方法,這種方法:

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"); 
    } 
} 

據我瞭解註解@Transactional只是不知何故包裝方法與另一些代碼。那麼我怎麼必須包裝aMethod()調用才能完全像Spring調用一樣調用它?

+0

[Spring @Transaction方法調用由同一類中的方法調用可能的副本,不起作用?](http://stackoverflow.com/questions/3423972/spring-transaction-method-call-by-the-方法在同一班,不禾窩) –

回答

1

當您從另一個bean調用它時,Spring僅添加其事務邏輯。當從同一個類中調用方法時,該註釋將被忽略。

對於您這意味着您應該將aMethod()移動到另一個Bean並從您現有的ABean中調用它。

2

您可以使用來自Hibernate的事務,而您所說的這種方法不會在Spring託管環境中運行並在語法上使用它。 從Hibernate SessionFactory創建Session對象。 從會話中你可以使用session.beginTransaction()獲取Transaction。 結賬: Hibernate Docs

+0

我沒有嘗試過這種方式,但你的答案看起來也工作。謝謝。 –