gpt4 book ai didi

java - 当对实体使用注释和 hbm 混合时,Spring/Hibernate 无法初始化 EntityManager

转载 作者:行者123 更新时间:2023-12-02 12:17:19 25 4
gpt4 key购买 nike

我有一个 Spring/Hibernate 项目,其中的实体是使用 hbm 和注释定义的。

当我尝试部署项目时,收到以下错误消息:

Caused by: org.hibernate.MappingException: Following super classes referenced in extends not found: hibernate.examples.model.Task
at org.hibernate.cfg.Configuration.processExtendsQueue(Configuration.java:1768) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1690) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
....................

我必须继续使用两者的原因是因为有些代码是遗留的,我目前无法触及它们。我们必须开始使用注释来创建任何新的实体。

这就是我将两种映射注册到配置中的方式:

    @Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("hibernate.examples.model", "models");
em.setMappingResources("Task.hbm.xml");
em.setMappingResources("HealthTask.hbm.xml");

final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibernateProperties());
return em;
}

setPackagesToScan 方法扫描所有由注释标记的实体,并且 setMappingResources 应该负责处理 hbm 文件。

当我注释掉 em.setMappingResources..... 时,项目就会毫无问题地部署。

此外,需要注意的奇怪部分是,当我将其作为独立应用程序运行时,即使用 public static void main(String[] args) 我在使用这两种类型时都没有任何问题映射。所有实体都已注册并创建模式。

这是我运行该项目的方式:

public class ConceptRunner {

public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();

ctx.register(HibernateConfiguration.class);
ctx.refresh();

System.exit(0);

}

}

但是当我部署项目时,它无法注册 hbm 文件。

这是我的 hbm 文件:

任务.hbm.xml

<hibernate-mapping>
<class name="hibernate.examples.model.Task" table="TASKS" abstract="true">
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0"/>
<generator class="identity"/>
</id>
<discriminator column="TYPE" type="string"/>
<property name="type" type="java.lang.String" insert="false" update="false">
<column name="TYPE" length="10"/>
</property>
<property name="name" type="java.lang.String">
<column name="NAME" length="50"/>
</property>
<property name="description" type="java.lang.String">
<column name="DESCRIPTION" length="250"/>
</property>
</class>
</hibernate-mapping>

HealthTask.hbm.xml

<hibernate-mapping>
<subclass name="hibernate.examples.model.HealthTask"
extends="hibernate.examples.model.Task" discriminator-value="HEALTH">
<property name="requestServed" type="java.lang.Long">
<column name="REQUEST_SERVED"/>
</property>
<property name="requestFailed" type="java.lang.Long">
<column name="REQUEST_FAILED"/>
</property>
<property name="totalRequest" type="java.lang.Long">
<column name="TOTAL_REQUEST"/>
</property>
</subclass>
</hibernate-mapping>

如果您还需要我提供任何其他信息,请告诉我。

最佳答案

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("hibernate.examples.model", "models");
em.setMappingResources("Task.hbm.xml");
em.setMappingResources("HealthTask.hbm.xml");

final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibernateProperties());
return em;
}

由于 setMappingResources 是一个 setter,每次调用它都会替换当前的资源集。由于您在代码中调用它两次,因此仅保留最后一个(HealthTask.hbm.xmlTask.hbm.xml 将被忽略)。

如果你看一下setMappingResourcesLocalContainerEntityManagerFactoryBean 中,您会注意到它采用 String... 作为参数(确切地说是 varargs 参数)。

因此,不要调用它两次,而是使用 2 个参数调用它一次。

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("hibernate.examples.model", "models");
em.setMappingResources("Task.hbm.xml", "HealthTask.hbm.xml");

final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibernateProperties());
return em;
}

关于java - 当对实体使用注释和 hbm 混合时,Spring/Hibernate 无法初始化 EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46064905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com