目前我正在將一個應用程式從 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”(當然在代碼中也沒有)。“logger-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,這段代碼以某種方式作業。
由于這是我無法輕易更改的依賴項,因此我不想通過重命名列或屬性來解決此問題。我能做些什么來解決這個問題?
uj5u.com熱心網友回復:
我想你應該糾正這個:
@Entity(name = "miscmessage_properties")
public class MiscMessageProperties {
...
對此:
import javax.persistence.Table;
@Entity
@Table(name="miscmessage_properties")
public class MiscMessageProperties {
...
如果您的意圖是為物體定義表名,MiscMessageProperties但不重命名通常情況下不必要的物體。
另請參閱休眠檔案的這一部分。
uj5u.com熱心網友回復:
請按照@SternK 的建議進行更正,并洗掉@Id 屬性上的分配,如下所示
@Entity
@Table(name = "miscmessage_properties")
public class MiscMessageProperties {
@Id
private PropertiesKey propertiesKey;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/336928.html
