由于 IntelliJ 中的单独模块导致 Hibernate 映射错误?
Hibernate Mapping Errors due Seperate Modules in IntelliJ?
使用多个具有独立 Hibernate 实例的模块
我正在创建一个多模块 Maven 项目,其中模块 ModuleA 和 ModuleB 在父项下。
Hibernate 抛出 MappingException
模块使用自己的 Hibernate 映射和自己的资源文件夹。每个模块都独立于其他模块保留其对象。现在,当我尝试从模块 A 中的模块 B 实例化 Class 时,我可以访问所有必需的方法,但是当我执行应用程序时,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 中 class 的映射另外添加到 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
的 Hibernate 配置文件。我在两个模块中重命名了这些配置文件。 ModuleA 的配置文件现在称为 hibernate.moduleA.cfg.xml
,ModuleB 的配置文件现在称为 hibernate.moduleB.cfg.xml
每个模块还包含一个 HibernateUtil.java class 用于初始化会话工厂。我还为每个模块重命名了 HibernateUtil classes。 ModuleA 的 Util class 现在称为 HibernateUtilModuleA
,而 ModuleB 的 Util class 称为 HibernateUtilModuleB
。现在两种配置之间没有混淆,Hibernate 现在知道为每个模块选择哪种配置。
然后我调整了两个 HibernateUtil classes 来加载单独的配置文件,如下所示:
HibernateUtilModuleA:
configuration.configure("hibernate.moduleA.cfg.xml");
HibernateUtilModuleB:
configuration.configure("hibernate.moduleB.cfg.xml");
ModuleA 的 HibernateUtil class 现在大致如下所示:
/**
* 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;
}
}
我遇到了同样的问题,我用 Composite Persistence Unit 解决了,但在我的例子中,我使用的是像 Jpa 实现一样的 eclipse link Composite Persistence Units. I found some information about Hibernate at this link,我认为解决你的问题的正确方法是这样的。
使用多个具有独立 Hibernate 实例的模块
我正在创建一个多模块 Maven 项目,其中模块 ModuleA 和 ModuleB 在父项下。
Hibernate 抛出 MappingException
模块使用自己的 Hibernate 映射和自己的资源文件夹。每个模块都独立于其他模块保留其对象。现在,当我尝试从模块 A 中的模块 B 实例化 Class 时,我可以访问所有必需的方法,但是当我执行应用程序时,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 中 class 的映射另外添加到 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
的 Hibernate 配置文件。我在两个模块中重命名了这些配置文件。 ModuleA 的配置文件现在称为 hibernate.moduleA.cfg.xml
,ModuleB 的配置文件现在称为 hibernate.moduleB.cfg.xml
每个模块还包含一个 HibernateUtil.java class 用于初始化会话工厂。我还为每个模块重命名了 HibernateUtil classes。 ModuleA 的 Util class 现在称为 HibernateUtilModuleA
,而 ModuleB 的 Util class 称为 HibernateUtilModuleB
。现在两种配置之间没有混淆,Hibernate 现在知道为每个模块选择哪种配置。
然后我调整了两个 HibernateUtil classes 来加载单独的配置文件,如下所示:
HibernateUtilModuleA:
configuration.configure("hibernate.moduleA.cfg.xml");
HibernateUtilModuleB:
configuration.configure("hibernate.moduleB.cfg.xml");
ModuleA 的 HibernateUtil class 现在大致如下所示:
/**
* 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;
}
}
我遇到了同样的问题,我用 Composite Persistence Unit 解决了,但在我的例子中,我使用的是像 Jpa 实现一样的 eclipse link Composite Persistence Units. I found some information about Hibernate at this link,我认为解决你的问题的正确方法是这样的。