2012-01-31 85 views
0

讓我看看我是否理解正確。通常情況下,我們應該努力把屬於一個「工作單位」的所有業務都放在同一筆交易中,對嗎?這有助於在操作鏈某處發生異常時恢復數據庫的狀態。關於交易和事件聽衆

但是,在我的特殊情況下,我有一箇舊服務,這是不容易插入我當前的代碼。因此,我必須保持它獨立運行,並賦予它當前應用程序存儲數據的相同數據庫的權限。

當我不得不向數據庫中插入一個新項目時出現問題。然後我必須致電該服務。如果我在一個事務中執行此操作,則該服務將在事務實際提交之前開始在數據庫中查找記錄。因此,我開始使用事件監聽器,即PostInsertEventListener和PostDeleteEventListener。

現在它可以正常工作,因爲事務事先提交,但是這完全破壞了我的代碼架構。我已經構建了一系列相互注入的服務,現在我必須聲明這兩個監聽器類。我猜,我能做的最好的事情是讓我的協調器服務實現這兩個偵聽器接口,但這樣我就完全將它連接到Hibernate,對吧?

一般來說,使用這些聽衆確實是像我這樣的情況的正確方法嗎?

回答

2

我不知道你從怎麼來的「我需要有交易調用外部服務之前所犯的」「我決定使用監聽器」

你爲什麼不只是有下面的代碼:

public void someNonTransactionalMethod() { 
    someTransactionalService.insertThingsInDatabase(); 
    externalService.foo(); 
} 

public void someMethod() { 
    someTransactionalService.insertThingsInDatabase(); 
    externalService.foo(); 
} 

其中insertThingsInDatabase使用REQUIRES_NEW傳播類型?