从sessionFactory切换到EntityManager后出现InvalidDataAccessApiUsageException

时间:2011-11-30 10:38:55

标签: hibernate spring jpa-2.0 entitymanager sessionfactory

有一个现有的应用程序,一切正常。但出于各种原因,我不得不从sessionFactory "org.springframework.orm.hibernate3.LocalSessionFactoryBean"切换到entityManagerFactory "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"。现在我在org.springframework.dao.InvalidDataAccessApiUsageException: Removing a detached instance server.model.instance.ComponentInstance获得了junit-integration.Test。 经过五六个小时毫无结果的谷歌搜索后,我决定在这里写下我的问题。我会很感激,任何帮助都会很棒。

这是junit测试代码,以及堆栈跟踪中提到的代码:

public void deleteComponentInstance ( ComponentInstance instanceToDelete ) {
    setComponentInstanceForeignKeyToNull ( instanceToDelete );
    deleteAndFlush ( instanceToDelete );
}

方法deleteAndFlush

public <P> void deleteAndFlush ( P persistentObject ) {
    Session session = sessionFactory.getCurrentSession ();
    session.delete ( persistentObject );
    session.flush ();
}

方法setComponentInstanceForeignKeyToNull

public void setComponentInstanceForeignKeyToNull ( Class<?> clazz, String attribute, Object value ) {
    StringBuilder hqlQuery = new StringBuilder ()
        .append ( "update " )
        .append ( clazz.getSimpleName () )
        .append ( " entity set entity." ).append ( attribute )
        .append ( " = null where entity." ).append ( attribute )
        .append ( " = :actualValue" );
    Session currentSession = this.sessionFactory.getCurrentSession ();
    currentSession.createQuery ( hqlQuery.toString () )
        .setEntity ( "actualValue", value )
        .executeUpdate ();        
}

切换到entityManager后,这是我的“beans.xml”

    <bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="persistenceUnitName" value="spring-jpa" />
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
                <property name="database" value="HSQL" />
         </bean>
      </property>
   </bean>

   <bean id="sessionFactory" factory-bean="entityManagerFactory" factory-method="getSessionFactory" />

   <tx:annotation-driven transaction-manager="transactionManager" />
   <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory" />
   </bean>

这是我的beans.xml befor the switch:

<bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mappingLocations" ref="hibernateMappingFiles" />
  <property name="hibernateProperties" ref="hibernateProperties" />

    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />

                           

我需要的EntityManager persistence.xml:

<persistence-unit name="spring-jpa">
  <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
     <property name="hibernate.show_sql" value="false" />
     <property name="hibernate.format_sql" value="false" />
     <property name="hibernate.hbm2ddl.auto" value="none" />
     <property name="javax.persistence.validation.mode" value="none" />
     <property name="hibernate.jdbc.use_streams_for_binary"
        value="true" />
     <property name="hibernate.jdbc.fetch_size" value="100" />
     <property name="hibernate.current_session_context_class" value="org.springframework.orm.hibernate3.SpringSessionContext" />
  </properties>

堆栈跟踪/故障跟踪:

    2011-11-30 09:41:01,890 [org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean#4929b0e1-1] INFO  server.interpreter.ast.ExecNativeOperator:893 - ExecNativeOperator SuccessCriteria RC satisfied
2011-11-30 09:41:01,890 [org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean#4929b0e1-1] INFO  server.interpreter.ast.ExecNativeOperator:481 - ExecNativeOperator executeProcess() finished successfully.
2011-11-30 09:41:01,900 [org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean#4929b0e1-1] INFO  server.locking.DeadlockDetectionLock:324 - Successfully released EXCLUSIVE server.locking.DeadlockDetectionLock@511ee8dd.
2011-11-30 09:41:01,924 [org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean#4929b0e1-1] ERROR server.interpreter.step.StepTemplate:162 - Interpreter step aborted.
org.springframework.dao.InvalidDataAccessApiUsageException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]; nested exception is java.lang.IllegalArgumentException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]
   at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:291)
   at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:125)
   at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
   at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
   at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
   at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
   at $Proxy65.deleteAndFlush(Unknown Source)
   at server.component.control.impl.ComponentInstanceServiceImpl.deleteComponentInstance(ComponentInstanceServiceImpl.java:66)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
   at $Proxy93.deleteComponentInstance(Unknown Source)
   at server.interpreter.ast.UninstallOperator$2.evaluateStep(UninstallOperator.java:143)
   at server.interpreter.ast.UninstallOperator$2.evaluateStep(UninstallOperator.java:1)
   at server.interpreter.step.StepTemplate$StepExceptionHandler.performProtectedAction(StepTemplate.java:133)
   at server.interpreter.step.StepTemplate.protocolStep(StepTemplate.java:86)
   at server.interpreter.ast.UninstallOperator.doEvaluate(UninstallOperator.java:152)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.AbstractEvaluable.nullSafeEvaluate(AbstractEvaluable.java:123)
   at server.interpreter.ast.SemicolonOperator.doEvaluate(SemicolonOperator.java:42)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.AbstractEvaluable.nullSafeEvaluate(AbstractEvaluable.java:123)
   at server.interpreter.ast.BlockOperator.doEvaluate(BlockOperator.java:41)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.ast.IfOperator$3.evaluateStep(IfOperator.java:128)
   at server.interpreter.step.StepTemplate$StepExceptionHandler.performProtectedAction(StepTemplate.java:133)
   at server.interpreter.step.StepTemplate.protocolStep(StepTemplate.java:86)
   at server.interpreter.ast.IfOperator.evaluateAndProtocolBlock(IfOperator.java:131)
   at server.interpreter.ast.IfOperator.access$2(IfOperator.java:119)
   at server.interpreter.ast.IfOperator$2.evaluateStep(IfOperator.java:68)
   at server.interpreter.ast.IfOperator$2.evaluateStep(IfOperator.java:1)
   at server.interpreter.step.StepTemplate$StepExceptionHandler.performProtectedAction(StepTemplate.java:133)
   at server.interpreter.step.StepTemplate.protocolStep(StepTemplate.java:86)
       at server.interpreter.ast.IfOperator.doEvaluate(IfOperator.java:76)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.security.SecurityContextInheritingCallable.call(SecurityContextInheritingCallable.java:47)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
   at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalArgumentException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]
   at org.hibernate.ejb.event.EJB3DeleteEventListener.performDetachedEntityDeletionCheck(EJB3DeleteEventListener.java:65)
   at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:108)
   at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
   at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:948)
   at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:926)
   at server.dao.hibernate.HibernateGenericDao.deleteAndFlush(HibernateGenericDao.java:32)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
   at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
   ... 78 more
2    011-11-30 09:41:01,951 [org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean#4929b0e1-1] WARN  server.interpreter.step.StepTemplate:154 - Interpreter step aborted.
server.process.control.StepAbortionAlreadyProtocolledException: org.springframework.dao.InvalidDataAccessApiUsageException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]; nested exception is java.lang.IllegalArgumentException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]
   at server.interpreter.step.StepTemplate$StepExceptionHandler.performProtectedAction(StepTemplate.java:164)
   at server.interpreter.ast.IfOperator.doEvaluate(IfOperator.java:76)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.AbstractEvaluable.nullSafeEvaluate(AbstractEvaluable.java:123)
   at server.interpreter.ast.SemicolonOperator.doEvaluate(SemicolonOperator.java:42)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.AbstractEvaluable.nullSafeEvaluate(AbstractEvaluable.java:123)
   at server.interpreter.ast.SemicolonOperator.doEvaluate(SemicolonOperator.java:43)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.AbstractEvaluable.nullSafeEvaluate(AbstractEvaluable.java:123)
   at server.interpreter.ast.SemicolonOperator.doEvaluate(SemicolonOperator.java:43)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.AbstractEvaluable.nullSafeEvaluate(AbstractEvaluable.java:123)
   at server.interpreter.ast.BlockOperator.doEvaluate(BlockOperator.java:41)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.ast.HostLockingOperator$2$2.doWhileLocked(HostLockingOperator.java:210)
   at server.host.control.impl.HostLockingServiceImpl$1.doWhileLocked(HostLockingServiceImpl.java:161)
   at server.host.control.impl.HostLockingServiceImpl.doLockAndExecute(HostLockingServiceImpl.java:199)
   at server.host.control.impl.HostLockingServiceImpl.lockAndExecute(HostLockingServiceImpl.java:148)
   at server.interpreter.ast.HostLockingOperator$2.evaluateStep(HostLockingOperator.java:199)
   at server.interpreter.ast.HostLockingOperator$2.evaluateStep(HostLockingOperator.java:1)
   at server.interpreter.step.StepTemplate$StepExceptionHandler.performProtectedAction(StepTemplate.java:133)
   at server.interpreter.step.StepTemplate.protocolStep(StepTemplate.java:86)
   at server.interpreter.ast.HostLockingOperator.doEvaluate(HostLockingOperator.java:229)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.AbstractEvaluable.nullSafeEvaluate(AbstractEvaluable.java:123)
   at server.interpreter.ast.MethodReturnOperator.doEvaluate(MethodReturnOperator.java:44)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.interpreter.ast.PlanOperator.doEvaluate(PlanOperator.java:54)
   at server.interpreter.AbstractEvaluable.evaluate(AbstractEvaluable.java:57)
   at server.model.boundary.impl.ModelExecutionServiceImpl$6.doExecute(ModelExecutionServiceImpl.java:483)
   at server.job.control.ProtocolSubJob.execute(ProtocolSubJob.java:86)
   at server.job.control.impl.JobExecutorServiceImpl$JobCallable.call(JobExecutorServiceImpl.java:497)
   at server.job.control.impl.JobExecutorServiceImpl$2.call(JobExecutorServiceImpl.java:249)
   at server.security.SecurityContextInheritingCallable.call(SecurityContextInheritingCallable.java:47)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
   at java.lang.Thread.run(Thread.java:662)
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]; nested exception is java.lang.IllegalArgumentException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]
   at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:291)
   at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:125)
   at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
   at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
   at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
   at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
   at $Proxy65.deleteAndFlush(Unknown Source)
   at server.component.control.impl.ComponentInstanceServiceImpl.deleteComponentInstance(ComponentInstanceServiceImpl.java:66)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
   at $Proxy93.deleteComponentInstance(Unknown Source)
   at server.interpreter.ast.UninstallOperator$2.evaluateStep(UninstallOperator.java:143)
   at server.interpreter.ast.UninstallOperator$2.evaluateStep(UninstallOperator.java:1)
   at server.interpreter.step.StepTemplate$StepExceptionHandler.performProtectedAction(StepTemplate.java:133)
   ... 60 more
Caused by: java.lang.IllegalArgumentException: Removing a detached instance server.model.instance.ComponentInstance#ComponentInstanceId[id=140]
   at org.hibernate.ejb.event.EJB3DeleteEventListener.performDetachedEntityDeletionCheck(EJB3DeleteEventListener.java:65)
   at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:108)
   at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
   at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:948)
   at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:926)
   at server.dao.hibernate.HibernateGenericDao.deleteAndFlush(HibernateGenericDao.java:32)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
   at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
   ... 78 more

1 个答案:

答案 0 :(得分:1)

看起来您错过了JPA的交易配置,它看起来应该与旧的相似:

<tx:annotation-driven transaction-manager="transactionManager" /> 
<bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>