2015-06-14 99 views
0

我正在創建一個使用JPA註釋模型 - 核心模型 - 的Java應用程序。在這些實體之上,在運行時,我想從包含其他一些JPA類定義和映射的外部源添加一個jar文件。導入的歸檔文件可能會更改其類結構和映射,但應用程序有義務在更改時刷新整個模式。Hibernate動態實體模型

但是,嘗試添加的jar到Hibernate配置的時候,我得到一個

org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 

內部異常有關休眠方言:

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set 

不過,我肯定有指定persistence.xml文件中的hibernate.dialect屬性。以下是我在我的應用程序中使用的代碼:

org.hibernate.cfg.Configuration cfg = new org.hibernate.cfg.Configuration(); 
cfg.addJar(new File("path/to/jar.jar")); 
cfg.buildSessionFactory(); 

我在做什麼錯?

另外,如果您發現這是一種創建多個應用程序之間共享的動態可更新模式的好方法,請告訴我嗎?

回答

0

我設法解決了這個問題。重點是,當使用EntityManagerFactory(JPA API)時,hibernate持久性提供程序僅讀取persistence.xml配置文件並加載其中指定的持久性單元。

但是,使用hibernate API配置時,hibernate不會讀取persistence.xml文件,因此必須在hibernate.cfg.xml文件中明確指定所有方面,如方言,連接參數等。

但是,我設法解決了這個問題。事實上,在動態加載的jar文件中,必須導出文件夾(尤其是META-INF)並在其中配置一個persistence.xml文件。但是,命名兩個持久性單元相同,其相應的類將而不是得到合併,任何其他屬性也不會。默認情況下,hibernate將加載第一個找到的持久性單元,並將相同名稱的持久單元視爲不同。所以,我創建了一個更靈活的核心模式,允許訪問多個持久性單元,同時將它們緩存到類似於字典的東西中。因此,對於我的應用程序中的每個模式,我將加載相應的持久性單元,同時將它們全部存儲在字典式容器中,以便在底層jar文件發生任何更改時通知應用程序。

相關問題