4 Replies Latest reply on Aug 27, 2012 12:17 PM by hantsy

    Caused by: org.hibernate.MappingException: Only one entity may be annotated with @RevisionEntity!

    hantsy

      I tried to use Hibernate Envers to log the entity histroy. but failed.

      My project used Spring 3.1, JPA and Spring Data JPA(Hibenrate 4.1).

       

      there is a based class.

       

      Code:

      @javax.persistence.MappedSuperclass
      public abstract class BaseEntity implements Serializable {

       

          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          @Column(name = "id", columnDefinition = "INT unsigned", nullable = false)
          @RevisionNumber
          public Long id;

       

          @Version
          @Column(name = "jpaversion", nullable = false, columnDefinition = "INT unsigned")
         @RevisionTimestamp
          public Long version;

       

          public Long getId() {
         return id;
          }

       

          public void setId(Long id) {
         this.id = id;
          }

       

          public Long getVersion() {
         return version;
          }

       

          public void setVersion(Long version) {
         this.version = version;
          }

       

          @Override
          public int hashCode() {
         final int prime = 31;
         int result = 1;
         result = prime * result + ((id == null) ? 0 : id.hashCode());
         return result;
          }

       

          @Override
          public boolean equals(Object obj) {
         if (this == obj)
             return true;
         if (obj == null)
             return false;
         if (getClass() != obj.getClass())
             return false;
         BaseEntity other = (BaseEntity) obj;
         if (id == null) {
             if (other.id != null)
            return false;
         } else if (!id.equals(other.id))
             return false;
         return true;
          }

       

      }

       

       

       

      When I added @RevisionEntity to my entites.

       

      Code:

      @Entity
      @RevisionEntity
      @Table(name = "user", uniqueConstraints = {
          @UniqueConstraint(name = "UQ_gsmPrefix_gsmNumber", columnNames = {"gsm_prefix", "gsm_number"}),
          @UniqueConstraint(name = "UQ_email", columnNames = "email"),
          @UniqueConstraint(name = "UQ_username", columnNames = "username")})
      @NamedQueries({
          @NamedQuery(name = "User.findByUsername", query = "select u from User u where u.username=:username"),
          @NamedQuery(name = "User.findByEmail", query = "select u from User u where u.email=:email")})
      @Access(AccessType.FIELD)
      public class User extends BaseEntity implements UserDetails, Serializable {

       

       

       

       

       

      Code:

      @Entity
      @Table(name = "address")
      @RevisionEntity
      public class Address extends com.dna.bifincan.model.BaseEntity

       

       

      and when I deployed the project into tomcat, I got the exception like this.

       

      Quote:

      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [jar:file:/E:/MyWorks/bifincan/project/bifincan-website/target/fi/WEB-INF/lib/bifincan-library-1.0-SNAPSHOT.jar!/common/data-access.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: bifincan] Unable to build EntityManagerFactory
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
      at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:728)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:449)
      at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
      at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
      at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
      at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
      at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649)
      at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:530)
      at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1471)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
      at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
      at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
      at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1436)
      at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:856)
      at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:353)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
      at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
      at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
      at java.lang.Thread.run(Thread.java:722)
      Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [jar:file:/E:/MyWorks/bifincan/project/bifincan-website/target/fi/WEB-INF/lib/bifincan-library-1.0-SNAPSHOT.jar!/common/data-access.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: bifincan] Unable to build EntityManagerFactory
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:400)
      at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:275)
      at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139)
      at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:79)
      at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70)
      at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:103)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1475)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1443)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
      ... 50 more
      Caused by: javax.persistence.PersistenceException: [PersistenceUnit: bifincan] Unable to build EntityManagerFactory
      at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
      at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
      at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
      at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)
      at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
      ... 65 more
      Caused by: org.hibernate.MappingException: Only one entity may be annotated with @RevisionEntity!
      at org.hibernate.envers.configuration.RevisionInfoConfiguration.configure(RevisionInfoConfiguration.java:264)
      at org.hibernate.envers.configuration.AuditConfiguration.<init>(AuditConfiguration.java:102)
      at org.hibernate.envers.configuration.AuditConfiguration.getFor(AuditConfiguration.java:165)
      at org.hibernate.envers.event.EnversIntegrator.integrate(EnversIntegrator.java:64)
      at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:302)
      at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1740)
      at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:88)
      at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
      ... 71 more

       

       

      Obviously, I used @Entity and @RevisitonEntity together, but it still report this info.

      I read the doc of related section in the Hibernate Dev Guide, it seems there does not need extra configuration in the persistence.xml or hibernate configuration.  Is there something I omitted in the Spring project.

       

      Any help is appreciated.