2014-02-28 39 views
4

對不起長篇的背景故事,但我想給出一個好主意,說明我們爲什麼要做我們正在做的事情。休眠:替換Ejb3Configuration類

我們的應用程序目前使用Hibernate 3.6,我們希望升級到Hibernate 4.3。

應用程序是專門寫避免使用persistence.xml配置JPA和創建EntityManagerFactory,而是使用Hibernate的Ejb3Configuration類像這樣(例如):

Properties properties = new Properties(); 
properties.put("javax.persistence.provider", "org.hibernate.ejb.HibernatePersistence"); 
properties.put("javax.persistence.transactionType", "RESOURCE_LOCAL"); 
properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect"); 
properties.put("hibernate.show_sql", "false"); 
properties.put("hibernate.format_sql", "true"); 

Ejb3Configuration cfg = new Ejb3Configuration(); 
cfg.addProperties(properties); 

DataSource dataSource = dataSourceProvider.get(); 
cfg.setDataSource(dataSource); 

//add the annotated classes 
cfg.addAnnotatedClass(SomePersistentObject.class); 

EntityManagerFactory factory = cfg.buildEntityManagerFactory(); 

我們這樣做的原因,這種方式是因爲我們有部署到Tomcat的Web應用程序(戰爭文件),提供「核心」功能。然後,我們在分解的/WEB-INF/lib目錄中安裝我們稱之爲「客戶端軟件包」的jar文件。 「客戶端軟件包」包含對Web應用程序現有「核心」行爲的重寫。這使得我們可以在一個Web應用程序實例中爲多個客戶端提供服務,每個客戶端都具有來自「核心」行爲的各種定製。我們知道基於傳入HTTP請求的域或子域使用哪個客戶端軟件包。

每個客戶端軟件包總是獲取自己的數據庫實例,因此每個客戶端軟件包都定義了它自己的EntityManagerFactory。儘管客戶端軟件包可以根據需要添加新的持久化類,但模式幾乎完全相同。

因此,我們在Java中進行JPA配置的原因是,每個客戶端軟件包都會擴展「核心」類並添加他們自己的實體類。 Java非常適合繼承,而XML會發臭。如果我們必須通過XML進行配置,那麼每個客戶端軟件包都需要複製核心的persistence.xml並從那裏更新。我寧願使用複製/粘貼繼承。

我認爲我們有通過Java,而不是XML寧願JPA配置一個相當有效的使用情況。

我的問題:Hibernate 4.3是否允許以任何方式?如果是這樣,我該怎麼辦?

如果沒有,沒有任何人有關於如何使我的上述情況下儘可能地簡單,而被卡住的XML配置有什麼建議?

一個web應用程序中的多個JAR文件可以包含/META-INF/persistence.xml文件,或做多的持續性單位需要定義另一種方式?

謝謝!

-Ryan

回答

2

我通過動態寫入新persistence.xml文件到Web應用程序的類路徑,JPA是自舉之前克服的問題。

當Web應用程序啓動時,將讀取所有客戶端軟件包的JPA配置,然後將單個persistence.xml文件寫入到類路徑中。每個客戶端軟件包都會在persistence.xml之內以persistence-unit的格式獲取自己的條目。

然後,新persistence.xml寫完後,JPA是自舉。顯然,JPA不知道或在意persistence.xml文件是動態寫入的。

這似乎有點像一個黑客,但我想不出任何其他方式來做到這一點。一個很好的好處是它讓我遠離Hibernate特定的API,所以如果我想要像JPA提供者那樣切換到像DataNucleus這樣的東西,我將會有靈活性來做到這一點。

+0

我不確定有多少高級開發人員會推薦這種方法,而不是使用API​​從(動態)源實現所需的實體工廠和配置。 –

+0

@DarrellTeague,你能指點我一些關於如何使用獨立於供應商的API來完成這項工作的文檔嗎?動態編寫'persistence.xml'也不是我的第一選擇,但我無法弄清楚如何使用JPA或Hibernate API來完成它。由於我們使用多個JPA提供程序,因此我必須遠離特定於供應商的API。我確信JPA提供了一種方法來做到這一點,我只是不知道如何。 – user3303372

+0

持久性類createEntityManagerFactory方法可用於獲取指定的持久性單元和屬性映射的EntityManager工廠實例。 https://docs.oracle.com/javaee/7/api/javax/persistence/Persistence.html#createEntityManagerFactory%28java.lang.String,%20java.util.Map%29。請注意,前面引用的Ejb3Configuration最近已被棄用,以替代此JPA標準化方法。另見http://stackoverflow.com/questions/16939415/create-entity-manager-factory-without-persistence-xml –