2011-08-02 91 views
7

我有一個大的非Java EE,基於JSF的Web應用程序項目。我們的系統是分層的(在源代碼意義上):有一個數據模型包,就是DAO包。我們僅在DAO包中使用Hibernate的XML配置映射。我們真的不想用註釋來混淆數據模型,但是並沒有專門嵌入到Hibernate中(除了映射非常複雜)。遷移Hibernate到JPA沒有標註

我強烈考慮正在朝着Java EE的移動和建設我們的DAO對象作爲EJB的。但正如我們不願意放棄Hibernate的XML,這使我幾個問題:

  • 是否有可能使用與JPA休眠而不對模型JPA註解?
  • 如果不是,我的EJB是否可以與Hibernate進行事務處理?我認爲這被稱爲JTA支持,但不確定。我喜歡「免費」獲得交易的想法;現在我們有一個自定義編碼的階段偵聽器,我想刪除它處理Hibernate事務。
  • 有沒有辦法從Hibernate的XML映射配置遷移到某種JPA XML映射?我沒有辦法做到這一點,但顯然減少我們與Hibernate的耦合會更好。

謝謝!

回答

8

是否有可能使用與JPA休眠而不對模型JPA註解?

是的,這是完全可能的。您可以在JPA標準映射文件 - orm.xml中指定對象模型類的所有相關屬性。您也可以擁有自己的映射文件,但您需要在persistence.xml中指定它們。

如果不是,我的EJB是否有可能與Hibernate進行事務處理?我認爲這被稱爲JTA支持,但不確定。

如果您使用的是EJB,您會發現容器管理事務非常有用。所有你需要做的是與所需@TransactionManagement@TransactionAttribute註釋來註釋EJB以及容器將自動管理交易對你來說,包括在方法結束(如果適用)提交事務,並回滾事務運行時異常事件或應用程序異常事件。

所有EntityManager情況下,即,所有的持久化上下文中,注入到這樣的EJB,將自動地與下面的JTA事務相關聯。請注意,只有在允許容器注入EntityManager實例時,情況纔是如此。如果您自己管理持久性上下文(通過從EntityManagerFactory實例創建它們),則可能需要調用EntityManager.joinTransaction()將持久性上下文中執行的所有工作與基礎JTA事務相關聯。這是必要的,因爲如果您已將持久性上下文配置爲使用JTA數據源,則EntityManager通常會將其自身與底層JTA事務關聯。如果不存在JTA事務,則不會發生此類關聯,因此如果要將更改刷新到數據庫,則必須加入活動的JTA轉換。

有沒有辦法從Hibernate的XML映射配置遷移到某種JPA XML映射?

我不知道任何這樣的工具,因爲我從來沒有遷移過一個項目,但這並不意味着沒有任何服務於此目的。您可能想看看支持JPA的Hibernate Tools項目,但我不確定它是否允許您從Hibernate XML格式轉換爲JPA格式。

3

是,JPA也支持XML映射。除了標準persistence.xml之外,您還有orm.xml和其他xml文件根據JPA xml架構聲明實體。 Here is a reference

至於事務EJB的 - 是的,他們可以是事務性(有或沒有在模型上JPA註解)

+0

而且它們可以與標準的Hibernate機器而不是JPA機器交易嗎? –

+0

他們肯定可以通過JPA。而JPA只是打包休眠。看@TransactionAttribute http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttribute.html – Bozho