org.hibernate.MappingException在创建实体管理器时列名与属性名不同 &g



目前我正在将一个应用程序从Hibernate 4升级到Hibernate 5(5.4.32),并在以下问题上挂起:

在应用程序启动时,当一些数据源之一被初始化时,我得到以下异常:

Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'logger-entityManagerFactory' defined in URL [jar:file:/commons-functional-logging-service/2.0.99-SNAPSHOT/mvb-commons-functional-logging-service-2.0.99-SNAPSHOT.jar!/META-INF/spring/cfl-datasource.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: property [properties] not found on entity [xxx.model.MiscMessageProperties]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5221)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.MappingException: property [properties] not found on entity [xxx.model.MiscMessageProperties]
at org.hibernate.mapping.PersistentClass.getProperty(PersistentClass.java:514)
at org.hibernate.mapping.PersistentClass.getProperty(PersistentClass.java:525)
at org.hibernate.cfg.IndexOrUniqueKeySecondPass.doSecondPass(IndexOrUniqueKeySecondPass.java:83)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1693)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1661)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
... 21 more

在xml配置中没有属性"properties"(当然代码中也没有提到)。loglogger - entitymanagerfactory的配置如下:

<bean id="logger-entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="logger-dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="database" value="${cfl.database.dialect}" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="javax.persistence.validation.factory" value-ref="validator" />
<entry key="hibernate.show_sql" value="${hibernate.show_sql}"/>
<entry key="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl}"/>
<entry key="org.hibernate.envers.revision_on_collection_change" value="true"/>
</map>
</property>
<property name="persistenceUnitName" value="xxx.commons.logging" />
<property name="persistenceUnitManager" ref="logger-persistenceUnitManager" />
</bean>

通过persistence.xml找到上述类,如下所示:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import de.mvbonline.commons.IdGenerator;
@Entity(name = "miscmessage_properties")
public class MiscMessageProperties {
@Id
private PropertiesKey propertiesKey = new PropertiesKey();
@Column(name = "properties", length = 256)
private String value;

public MiscMessageProperties() {
}
public String getId() {
return this.propertiesKey.getId();
}
public void setId(String id) {
this.propertiesKey.setId(id);
}
public String getKey() {
return this.propertiesKey.getKey();
}
public void setKey(String key) {
this.propertiesKey.setKey(key);
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

据我所知,它并不罕见,并且允许为属性和列名使用不同的名称。我还找到了很多类似于我的代码的例子。我偶然发现的唯一已知问题是在同一文件上使用了@Index注释,这里的情况并非如此。在Hibernate 4中,这些代码可以正常工作。

因为这是一个我不能轻易改变的依赖关系,所以我不希望通过重命名列或属性来解决这个问题。我怎么做才能解决这个问题?

我想你应该纠正这个:

@Entity(name = "miscmessage_properties")
public class MiscMessageProperties {
...

:

import javax.persistence.Table;
@Entity
@Table(name="miscmessage_properties")
public class MiscMessageProperties {
...

如果您的意图是为实体MiscMessageProperties定义一个表名,而不是在通常情况下重命名实体,

请参阅hibernate文档的这一部分。

请按照@SternK的建议进行更正,并删除@Id属性的赋值,如

@Entity
@Table(name = "miscmessage_properties")
public class MiscMessageProperties {
@Id
private PropertiesKey propertiesKey;
}

最新更新