2012-12-21 63 views
7

我們有一個困難的情況。在Spring中使用JPA EntityManager和Hibernate會話與共享事務管理器

  1. 有一個大型項目,它使用休眠特性,所以不能退出休眠。
  2. 我們要將Activiti流程引擎添加到嵌入模式的項目中,並使用JPA擴展(僅適用於EntityManager)
  3. 某些實體不應存在於JPA持久單元中,因爲activiti文檔說所有實體都必須有@Id並且不能使用@ IdClass/@ EmbeddedId,所以我們必須從持久單元中排除這些實體
  4. 我們希望爲EntityManager和Session使用一個共享事務管理器。此外,數據源是相同的(甚至是共享的)
  5. 一切都是春天!

所有這些努力都是爲了讓Activiti能夠使用EntityManager作爲其JPA擴展,同時讓現有的依賴hibernate的代碼繼續工作。

回答

3

首先,如果你想擁有一個持久化單元,並且實際上在你的Hibernate實體中使用@ IdClass/@ EmbeddedId,你的第三點可能會很棘手。這裏有兩個可能的解決方案:

  1. 拉JPA到你的項目,併爲您現有的Hibernate實體來配置持久化單元,但continute委派現有呼叫通過直接訪問會話休眠。在這種情況下,您的配置將移至JPA,但您的代碼不會。這種方法還假定您有一些合理的抽象,以可插拔的方式分配Session對象。見this question for the crux of the solution。如果你在上面第3點沒有靈活性,這種方法可能不適合你。

  2. 創建會話工廠和持久性單元,並使用帶有兩個XA數據源的JTA協調事務。即使您的數據可能駐留在同一個數據庫中,但如果採用此方法,則需要確保在配置中創建不同的數據源。這將防止Spring的事務代理在您參與分佈式事務時感到困惑。這可能是最乾淨的方法,但確實帶來了XA交易的恥辱,這取決於你的集裝箱,現在更多的是政治問題而不是技術問題。

相關問題