[英]Seam @Transactional annotation not working?
我在接縫組件上使用@Transactional注釋類似於:
@Name( "myComponent" )
@AutoCreate
public class MyComponent
{
public void something() {
...
doWork();
}
...
@Transactional
protected void doWork() {
try {
log.debug( "transaction active: " + Transaction.instance().isActive() );
} catch (Exception ignore) {}
// some more stuff here that doesn't appear to be inside a transaction
}
}
在“更多東西”部分,我正在修改一些Hibernate實體,然后有一個錯誤,拋出異常。 我注意到Exception沒有導致事務被回滾(修改后的實體仍在db中被修改)所以我添加了“事務活動”日志記錄。 執行此代碼時,isActive()返回false。
有什么我想念的嗎? 為什么交易不活躍?
如果它很重要,我正在使用另一個使用RESTEasy注釋的組件內部的Seam組件來觸發我的方法調用。
我不熟悉Seam是如何工作的,所以如果這個答案不適用,我會提前道歉。
我注意到@Transactional
的方法protected
。 這意味着它被另一個內部方法調用。
使用Spring的AOP,您可以使用@Transactional
標記公共方法,這些方法將被包裝並替換為事務代理。 當外部類調用public
方法時,它調用構成事務的代理。 如果外部類調用另一個未使用@Transactional
標記的public
方法,然后調用內部方法,則不會創建任何事務,因為根本沒有調用代理。
在Spring中,即使您將doWork()
方法更改為公共方法,也會發生同樣的問題。 沒有事務,因為沒有調用代理對象。 在類內部進行的方法調用不會調用代理對象。
快速閱讀一些文檔似乎表明,像Spring AOP一樣,Seam正在使用CGLib代理 。 問題是它是否能夠代理所有方法 - 即使它們是從代理對象中調用的。 很抱歉,如果此答案不適用,請浪費您的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.