2012-06-21 29 views
0

我试图使用Hibernate Envers来记录实体历史记录。但失败了。引起:org.hibernate.MappingException:只有一个实体可能使用@RevisionEntity注释

我的项目使用Spring 3.1,JPA和Spring Data JPA(Hibenrate 4.1)。

有一个基础类。

代码:

@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; 
    } 



} 

当我加入@RevisionEntity我的entites。

代码:

@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 { 

代码:

@Entity @Table(name = “地址”) @RevisionEntity 公共类地址扩展com.dna.bifincan .model.BaseEntity

当我将项目部署到tomcat时,我得到了这样的异常。

报价:

org.springframework.beans.factory.BeanCreationException:错误 创建名称为 豆'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0: 初始化bean的失败;嵌套的异常是 org.springframework.beans.factory.BeanCreationException:错误 在URL中定义的名称为'entityManagerFactory'的bean创建的URL [jar:file:/ E:/ MyWorks/bifincan/project/bifincan-website/target/fi/WEB-INF/lib/bifincan-library-1.0-SNAPSHOT.jar!/common/data-access.xml]: 调用init方法失败;嵌套的异常是 javax.persistence.PersistenceException:[PersistenceUnit:bifincan] 无法在org.springframework.beans在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 构建的EntityManagerFactory 。 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) a t org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessor(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。 org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java: 649) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:530) org.apache.catalina.startup.HostConfig.check(HostConfig.java:1471) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:601) 在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) 在org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java :243) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:210) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 的组织。在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(AuthenticatorBase.java:581) ErrorReportValve.java:98) 在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 的组织。 apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at o rg.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) 原因:org.springframework.beans.factory.BeanCreationException:错误 在URL中创建名为'entityManagerFactory'的bean [jar:file:/ E :/MyWorks/bifincan/project/bifincan-website/target/fi/WEB-INF/lib/bifincan-library-1.0-SNAPSHOT.jar!/common/data-access.xml]: 调用init方法失败;嵌套的异常是 javax.persistence.PersistenceException:[PersistenceUnit:bifincan] 无法在org.springframework.beans在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) 构建的EntityManagerFactory 。 factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 在org.springframework.beans.factory.support.AbstractBeanFactory $ 1 .getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225 ) 在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在org.springframework .beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:400) 在org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:275) 在org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators (PersistenceExceptionTranslationInterceptor.java:139) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor。(PersistenceExceptionTranslationInterceptor.java:79) at org.springframework.d ao.annotation.PersistenceExceptionTranslationAdvisor。(PersistenceExceptionTranslationAdvisor.java:70) 在org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:103) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory的.java:1475) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1443) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) ... 50更多 引起:javax.persistence.PersistenceException:[PersistenceUnit:bifincan]无法构建EntityManagerFac托里 在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914) 在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889) 在org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence的.java:73) 在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268) 在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) 在org.springframework .beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) at org.springframework.beans.factory.support.Abs tractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ... 65更多 引起:org.hibernate.MappingException:只有一个实体可能使用@RevisionEntity进行注释! at org.hibernate.envers.configuration.RevisionInfoConfiguration.configure(RevisionInfoConfiguration.java:264) at org.hibernate.envers.configuration.AuditConfiguration。(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。(SessionFactoryImpl。的java:302) 在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1740) 在org.hibernate.ejb.EntityManagerFactoryImpl(EntityManagerFactoryImpl.java:88) 在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory。 (Ejb3Configuration.java:904) ...... 71多个

很显然,我用@Entity和@RevisitonEntity在一起,但它仍然报告信息。

我在Hibernate Dev Guide中阅读了相关章节的文档,似乎在persistence.xml或hibernate配置中不需要额外的配置。在Spring项目中我省略了一些东西。

任何帮助表示赞赏。

回答

0

为什么你需要用@RevisionEntity注释你的实体?

@RevisionEntity是代表修订本身的特殊用途实体。如果您想让Envers审核您的实体,请使用@Audited对其进行注释。

相关问题