2012-07-12 122 views
0

有什麼辦法從線程中刪除/掛起當前的spring管理的hibernate會話,以便可以使用新會話,然後將原始會話放回線程?兩者都在研究相同的數據源。「暫停」由spring事務管理器管理的休眠會話

更詳細地描述問題。我試圖爲擁有自己的spring hibernate事務管理的工具創建一個插件。在這個插件中,我想做一些我自己的數據庫的東西,這是在我們自己的spring事務管理器上完成的。當我現在嘗試執行數據庫操作我們的事務管理器開始抱怨了不兼容的事務管理器已被使用

org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.

,似乎這樣的伎倆運行自己的代碼在不同的線程和等待解決辦法在繼續執行其他代碼之前完成。

那麼有沒有更好的辦法,看起來有點愚蠢/矯枉過正?一些暫停當前休眠會話的方法,然後打開一個新的會話並恢復原來的會話。

回答

0

是否有任何理由不能將當前事務管理器注入到您的插件代碼中?兩個tx經理聽起來像廚房裏有太多廚師。如果您已將其注入,則在使用@transactional annotation's傳播REQUIRES_NEW屬性參閱文檔以查看示例設置

例如,您應該能夠在進行工作之前需要新會話。

@transactional(propogation = Propogation.REQUIRES_NEW) 
public void addXXX(Some class) { 
    ... 
} 

但這將使用Spring的PlatformTransactionManager,而不是留給了Hibernate來管理會話/事務。

+0

這樣做的問題是,他們用自己的代碼段包裝sessionfactory和transactionmanager。另一個問題是,我們沒有任何方法將我們的hbm映射添加到他們正在使用hibernate事務管理器的事務管理器 – user1344117 2012-07-13 05:04:55

+0

中? – 2012-07-13 13:19:04

+0

spring事務管理器用自己編寫的一些代碼包裝 – user1344117 2012-07-17 08:11:48