Given that * all my entities are mapped using hbm files * using hibernate envers annotations (Audited and AuditMappedBy) * OneToMany relationship to an entity where the "mapped by" is in the superclass @AuditMappedBy can't find the mapped by property (that's in the superclass of the target entity)
The following issue happens: {code:java} Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/spring/jpa.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: @AuditMappedBy points to a property that doesn't exist: com.myapp.entities.MyOtherEntity.myEntity at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.myapp.App.main(App.java:9) Caused by: org.hibernate.MappingException: @AuditMappedBy points to a property that doesn't exist: com.myapp.entities.MyOtherEntity.myEntity at org.hibernate.envers.configuration.internal.ClassesAuditingData.forcePropertyInsertable(ClassesAuditingData.java:174) at org.hibernate.envers.configuration.internal.ClassesAuditingData.setAuditMappedByInsertable(ClassesAuditingData.java:133) at org.hibernate.envers.configuration.internal.ClassesAuditingData.updateCalculatedProperty(ClassesAuditingData.java:103) at org.hibernate.envers.configuration.internal.ClassesAuditingData.updateCalculatedFields(ClassesAuditingData.java:86) at org.hibernate.envers.configuration.internal.EntitiesConfigurator.configure(EntitiesConfigurator.java:72) at org.hibernate.envers.boot.internal.EnversServiceImpl.doInitialize(EnversServiceImpl.java:154) at org.hibernate.envers.boot.internal.EnversServiceImpl.initialize(EnversServiceImpl.java:118) at org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl.produceAdditionalMappings(AdditionalJaxbMappingProducerImpl.java:99) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:288) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885) at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:151) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ... 12 more {code}
{code:java} @Audited public class MyEntity {
private Integer id; private String name;
@AuditMappedBy(mappedBy = "myEntity") private List<MyOtherEntity> myOtherEntities;
@Audited public class MyOtherEntity extends MyAbstractOtherEntity { private String name;
@Audited public abstract class MyAbstractOtherEntity {
private Integer id; private Integer type; private MyEntity myEntity; {code}
{code:xml} <hibernate-mapping default-access="field" default-cascade="refresh,persist" default-lazy="false"> <class name="com.myapp.entities.MyEntity" table="MYENTITY"> <id name="id" column="id" access="property" type="integer" /> <property name="name" column="name" type="string" length="250" /> <bag name="myOtherEntities" inverse="true" lazy="true" fetch="subselect" cascade="all-delete-orphan"> <key column="MyEntity" foreign-key="none" /> <one-to-many class="com.myapp.entities.MyOtherEntity" /> </bag> </class> </hibernate-mapping>
<class name="com.myapp.entities.MyAbstractOtherEntity" table="MYABSTRACTOTHERENTITY" abstract="true" discriminator-value="null" > <id name="id" column="id" access="property" type="integer" /> <discriminator column="TYPE" type="integer" force="true" /> <many-to-one name="myEntity" column="myEntity" class="com.myapp.entities.MyEntity" lazy="false" fetch="select" cascade="none"/> </class>
<subclass name="com.myapp.entities.MyOtherEntity" extends="com.myapp.entities.MyAbstractOtherEntity" discriminator-value="2" lazy="false"> <property name="name" column="name" type="string" length="250" /> </subclass> {code}
The failing test case is attached: MyApp.zip Main class: com.myapp.App |
|