2011-11-22 126 views
4

例如當:多個標記使用@Transactional

@Transactional 
public boolean addPersonToDb(Person p) { // message on this line 
//some logic 
} 

代碼編譯,並沒有任何問題運行。

消息本身:在該行多個標記

  • 實現

com.pname1.pname2.pname3.pname4.PersonDAO.addPersonToDb

  • 通過
建議

org.springframework.transaction。 interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)

我真的不明白,如果它是一個錯誤或只是一個消息,看着其他線程人們把它當作一個錯誤。我只是擔心我的交易是否有效。

好吧,類實現接口和它的方法註釋爲事務性的,有什麼不對嗎?

更新:解決了一些小錯誤,Web應用程序的作品,但我仍然得到這一信息(而不是在堆棧跟蹤,但上線斷點):由 org.springframework.transaction.interceptor建議

.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)

現狀:

 @Transactional 
    public void registerNewUser(Person p) { // this gives message on line breakpoint - advised by ...; AND this method is implemented by interface 

    pd.addPersonToDb(p); 


} 

@Transactional 
public void blabla(Person p){ // this does not, as expected; AND it is not in interface 

} 

我的交易是否有效? (我有沒有異常和運行Web應用程序和方法的工作)

我不明白,如果這條消息的錯誤或不?

+0

這是可以的。使一個方法實現事務性,即使實現的方法本身不是事務性的。這意味着問題在於別處。你能粘貼完整的堆棧跟蹤嗎? – ruhsuzbaykus

+0

請參閱更新的答案 – Aubergine

回答

5

多標記問題根本不是問題;它純粹是信息性的。 (該方法是一個接口或抽象方法的實現,你可能已經知道,它是通過AOP攔截,因爲@Transactional註釋的。我希望這不會令你感到驚訝......的一部分)

的錯誤是因爲你註釋沒有實現合適的接口(或接口)的類,這將需要使用內置的JDK代理機制把AOP攔截器在發生在豆。 (豆級攔截器將通過應用的事務行爲,然後委託給實際對象的代理對象完成)。JDK代理機制只能與接口工程;攔截任何其他事情需要不同的方法。

這兩個可能的解決方法是:

  1. 讓bean類實現具有所有類的標記爲@Transactional方法的合適的接口。
  2. 將cglib添加爲依賴項,Spring使用它來動態編寫執行截取的類。 (這是聰明的東西。)

你只需要使用這些修補程序之一,第二個是很容易如果您使用的是構建系統和類似Maven;只是更新依賴關係。 (另外,要避免通過this做調用攔截方法,明確或不。那側步的AOP攔截。)

+0

我使用maven,我添加了cglib,但是現在每當我嘗試在實現類中註釋接口實現的方法時,我都會得到這個建議,但是當我在其他方法上使用事務時(未在實現的接口中指定)一切正常。爲什麼我不能註釋接口實現的方法? – Aubergine

+0

我不知道有什麼問題,但我確信當我做這種事時,它對我來說工作得很好。我在我的依賴中包含CGLIB並讓Spring全力以赴...... –

+0

我必須承認你的描述對我來說很困難,所以這條消息可能是或者不可以的?現在我沒有任何異常,只有這條消息在線路斷點上。請參閱更新後的答案:-) – Aubergine

1

您的交易將正常工作,提供一切是正確的。 「建議」這裏純粹是信息性的,表明你的方法被Spring的TransactionInterceptor.invoke方法所建議。

關於多個標誌的問題,它表明,當你實現了某些東西,因爲有兩個信息:第一是「以勸」,和第二,這種方法實現的東西。

如果您不確定,我建議您編寫一個集成測試並測試數據庫中的更改。但是你不需要做其他任何事情,你的代碼就會按照原樣運行。 (如果,正如我前面所說的,一切是正確的。)

+0

謝謝,請不要downvote以前的答案,這是正確的,我有一個錯誤之前解決了,這是我愚蠢的愚蠢混亂。當第一次彈出喜歡這些建議標記的東西時,它會讓我發瘋(控制怪胎):-) – Aubergine

2

我有同樣的紅色標記旁邊方法簽名與上述@Transactional註解。

@Override 
@Transactional 
public void updateBook(Book book) { 
    bookDao.updateBook(book); 
} 

這樣的標記的信息是如在此線 以下

多個標記 - 實現bookmanager.service.BookService.updateBook - 通過 org.springframework.transaction.interceptor.TransactionInterceptor勸.invoke(org.aopalliance.intercept.MethodInvocation)

我的修復是我替換了這個註釋@org.springframework.transaction.annotation.Transactional,註釋如下@javax.transaction.Transactional

我用Hibernate框架在我的應用程序來管理事務。

希望它能幫助你。