当前位置: 首页 > 知识库问答 >
问题:

IntelliJ中独立模块导致的Hibernate映射错误?

杭英杰
2023-03-14

我正在创建一个多模块maven项目,其中模块ModuleA和ModuleB位于父项目之下。

这些模块使用自己的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中类的映射添加到模块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配置文件。我在两个模块中重命名了这些配置文件。模块 A 的配置文件现在称为Hibernate模块 A.cfg.xml模块 B 的配置文件现在称为Hibernate模块 B.cfg.xml

每个模块还包含一个用于初始化会话工厂的HibernateUtil.java类。我还为每个模块重命名了HibernateUtil类。ModuleA的Util类现在称为HibernateUtilModuleA,而ModuleB的Util类称为HibernateUtilModuleB。现在两种配置之间没有混淆,Hibernate现在知道为每个模块选择哪个配置。

然后,我改编了两个HibernateUtil 类来加载各个配置文件,如下所示:

Hibernate Util模块A:

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;
    }
}

共有1个答案

秦学林
2023-03-14

我有同样的问题,我用复合持久性单元解决了,但在我的情况下,我使用的是Eclipse链接,如Jpa实现复合持久性单元。我在这个链接上找到了一些关于Hibernate的信息,我认为解决问题的正确方法是这样。

 类似资料:
  • 我正在使用Hibernate和JPA注释来映射我的类。当hibernate尝试映射这个类时,我遇到了一个问题 我的Social alStat类是: 我得到了这个错误: 我猜发生这种情况是因为我试图映射到一个基本类,但@ElementCollection注释不应该解决这个问题吗? 我的item类如下所示:

  • 我有2个数据库表。First在其中有交易。每个交易都有一个ID。这个ID也在我的第二个表中找到。第二个表包含收费,但我的第一个表没有有关收费的信息。现在我必须通过冬眠映射获得连接到1个交易的所有费用,但我不想有它在两个方向。 贸易类:

  • 我刚开始冬眠。写一个复合字体。当我运行代码时,我得到一个错误。所有物 映射的列数错误:请帮助我缺少什么? 我的组合类型如下 我的域类股票有五个属性。(股票ID、股票代码、股票名称、状态、股票描述) 我需要声明字段股票描述为复合字段类型。 } 当我尝试执行股票插入时。我得到的错误错误创建bean与名称 在类路径资源[spring/config/./database/Hibernate.xml]中定义

  • 我试图在类别和发布类(OneToMany)之间建立关系,我需要删除所有属于特定类别的发布。我不知道我是否遗漏了一些注释,但这是我在执行查询时的错误: org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常org.hibernate.exception.ConstraintViolationException:无法执行更新查询o

  • 我有一个产品数据库。我已经创建了一个简单的Hibernate项目来从数据库中检索所有的产品。但是,我在编译代码时出现了以下异常: 令人惊讶的是,将prodcuts添加到数据库中可以正常工作。

  • 我正在使用与共享主键一对一映射。