2015-01-15 45 views
1

使用幾個模塊與獨立的休眠實例

我正在創建一個多模塊Maven項目,其模塊ModuleA和ModuleB下面的父級。由於IntelliJ中的獨立模塊導致Hibernate映射錯誤?

休眠拋出一個MappingException

模塊使用自己的Hibernate映射有自己的資源文件夾。每個模塊獨立於其他模塊保持其對象。現在,當我嘗試實例從模塊B模塊A中的類,我可以訪問所有需要的方法,但是當我執行應用程序時,Hibernate拋出這個錯誤:

Exception in thread "main" org.hibernate.MappingException: Unknown entity: org.example.ModuleB.Person 
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1096) 
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1443) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:116) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 

我可以添加映射類從ModuleB另外添加到模塊A的Hibernate配置文件中。然後運行。但這不是應該如何工作,因爲每個模塊都應該是獨立的。它理論上可以存儲在完全不同的RDBMS中。

更多的背景

本來我只用了只有一個模塊,將其分割它,並希望有更distangled。我執行mvn clean並從頭開始編譯所有內容。

另外從Modue甲pom.xml中對模塊B.

<dependency> 
     <groupId>org.example</groupId> 
     <artifactId>ModuleB</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </dependency> 

的依賴所提議的@Skizzo,我剛改名爲每個模塊的配置文件。最初,每個模塊都包含一個名爲hibernate.cfg.xml的Hibernate配置文件。我在兩個模塊中重命名了這些配置文件。 ModuleA的配置文件現在稱爲hibernate.moduleA.cfg.xml,ModuleB的配置文件現在稱爲hibernate.moduleB.cfg.xml

每個模塊還包含一個用於初始化Session Factory的HibernateUtil.java類。我也爲每個模塊重新命名了HibernateUtil類。 ModuleA的Util類現在稱爲HibernateUtilModuleA,而ModuleB的Util類稱爲HibernateUtilModuleB。現在,兩種配置之間沒有混淆可能,Hibernate現在知道爲每個模塊選擇哪種配置。

然後我適應兩個的HibernateUtil類加載單獨的配置文件是這樣的:

HibernateUtilModuleA:

configuration.configure("hibernate.moduleA.cfg.xml"); 

HibernateUtilModuleB:

configuration.configure("hibernate.moduleB.cfg.xml"); 

爲ModuleA HibernateUtil類現在看起來大致像這樣:

/** 
* Hibernate session management 
*/ 
public class HibernateUtilModuleA { 
    private static SessionFactory sessionFactory; 
    private static ServiceRegistry serviceRegistry; 

    static { 
    try { 

     Configuration configuration = new Configuration(); 

     configuration.configure("hibernate.ModuleA.cfg.xml"); 

     serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 


    } catch (HibernateException he) { 
     System.err.println("Error creating Session: " + he); 
     throw new ExceptionInInitializerError(he); 
    } 
    } 


    public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
    } 
} 
+0

我認爲我們需要看到更多的POM文件(對於父級和模塊) - 儘管我們不需要第三方依賴性位,所以可以截斷它們。我們需要知道這些模塊是罐子還是打包成獨立的戰爭,我們需要知道它們之間的關係(依賴關係)。 – 2015-01-15 17:57:27

回答

1

我有你的同樣的問題,我解決了與複合持久單位,但在我的情況下,我使用日食鏈接像Jpa實施Composite Persistence Units。我在這個link發現了關於Hibernate的一些信息,我認爲解決你的問題的正確方法是這樣的。

+0

謝謝,這個伎倆!你有任何解釋,爲什麼Hibernate不能區分不同的配置? – Stefan 2015-01-16 08:13:17

+0

@MightyApe你可以更新你的問題,並添加更多關於你的解決方案的細節。 – Skizzo 2015-01-16 08:58:32

+0

我包含了關於重命名類文件和配置文件的更多細節。你需要更多的細節嗎?有什麼缺失? – Stefan 2015-01-16 12:29:48