1

使用多个具有独立 Hibernate 实例的模块

我正在创建一个多模块 maven 项目,其模块 ModuleA 和 ModuleB 在父级下方。

Hibernate 抛出一个 MappingException

这些模块使用自己的 Hibernate 映射和自己的资源文件夹。每个模块都独立于其他模块保存其对象。现在,当我尝试从模块 A 中的模块 B 实例化一个类时,我可以访问所有必需的方法,但是当我执行应用程序时,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中的类的映射另外添加到Module A的Hibernate配置文件中。然后它就可以工作了。但这不是它应该如何工作的,因为每个模块都应该是独立的。理论上它可以存储在完全不同的 RDBMS 中。

更多背景

本来我只用了一个模块,它把它拆分了,想让它更杂乱无章。我执行 mvn clean 并从头开始编译所有内容。

此外,来自模块 A 的 pom.xml 依赖于模块 B。

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

解决方案

正如@Skizzo 所建议的,我只是重命名了每个模块的配置文件。最初,每个模块都包含一个名为hibernate.cfg.xml. 我在两个模块中重命名了这些配置文件。现在调用 ModuleAhibernate.moduleA.cfg.xml的配置文件,现在调用 ModuleB 的配置文件hibernate.moduleB.cfg.xml

每个模块还包含一个用于初始化会话工厂的 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;
    }
}
4

1 回答 1

1

我遇到了同样的问题,我用Composite Persistence Unit解决了,但在我的情况下,我使用的是像 Jpa implementation Composite Persistence Units这样的 eclipse 链接。我在这个链接上找到了一些关于 Hibernate 的信息,我认为解决你的问题的正确方法是这样的。

于 2015-01-15T16:16:50.950 回答