2011-08-05 51 views
2

如果我有方法CDI:應該調用來自同一個bean的非截獲方法的攔截方法嵌套調用?

public List<IrcEvent> getEventsByCriteria(IrcEventCriteria crit, boolean descending) { 
    return getEventsByCriteria(crit, 0, Integer.MAX_VALUE, descending); 
} 

@JpaTransactional 
public List<IrcEvent> getEventsByCriteria(IrcEventCriteria crit, int first, int count, boolean descending) { 
    ... 
} 

那麼第一種方法也必須標註的@JpaTransactional吧?

我剛剛發現,當一個bean調用自己截獲的方法時,攔截器不會被觸發。 我認爲這是因爲它不是所謂的代理,而是「真實實例」本身,因此它不通過代理。

這是涵蓋了規範/文檔?我還沒有找到它。 我問,因爲我想確保如果我註釋所有公共方法,他們將不會在將來多次調用攔截器。

回答

1

我不記得在規範中看到它,但這是代理工作的方式。但無論如何,這與事務傳播有關 - 無論是否使用現有正在運行的事務調用事務方法,都應啓動新事務。

獲取Seam 3 persistence模塊(帶事務支持)

+1

「但這是代理工作的方式」 - 的確如此。這在EJB中是一樣的。如果一個bean調用自己的方法,他們不會通過代理。因此,如果事務屬性爲'not-supported'的方法調用事務屬性爲'required'的自己的方法,則不會啓動TX,這可能會造成一些混淆。 –

+0

Ad Seam 3 - 這個Java SE應用程序,所以我自己實現了簡單的事務傳播。 –

1

第二屆「內部」呼叫不是通過上下文引用了,所以它不是攔截。