Results 1 to 8 of 8

Thread: InvalidDataAccessApiUsageException after switchin from sessionFactory to EntityManage

Hybrid View

  1. #1
    Join Date
    Nov 2011
    Posts
    11

    Default InvalidDataAccessApiUsageException after switchin from sessionFactory to EntityManage

    there were an existing application, which everything worked fine. But for various reasons I had to switch from sessionFactory "org.springframework.orm.hibernate3.LocalSessionFa ctoryBean" to the entityManagerFactory "org.springframework.orm.jpa.LocalContainerEntityM anagerFactoryBean". Now I�m getting an "org.springframework.dao.InvalidDataAccessApiUsage Exception: Removing a detached instance server.model.instance.ComponentInstance" at a junit-integration.Test. After a five or six hours of fruitless googling, I decided to write my issue here. I would be thankful and It would be great for any help.

    This is the junit test code, and the code which is mentioned at the stack trace:

    Code:
    public void deleteComponentInstance ( ComponentInstance instanceToDelete ) {
        setComponentInstanceForeignKeyToNull ( instanceToDelete );
        deleteAndFlush ( instanceToDelete );
    }
    the Method deleteAndFlush

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

    Code:
    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 ();        
    }
    this is my "beans.xml" after switching to the entityManager

    Code:
    <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>
    this is my beans.xml befor the switch:

    Code:
    <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" />
    my new needed persistence.xml for the EntityManager:

    Code:
    <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>

  2. #2
    Join Date
    Nov 2011
    Posts
    11

    Default

    the Stack Trace/Failure Trace:

    Code:
    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
    ...

  3. #3
    Join Date
    Jun 2006
    Location
    The Netherlands
    Posts
    13,695

    Default

    Don't use the HibernateTransactionManager use the JpaTransactionManager. Use the correct TransactionManager for the technology you use.
    Marten Deinum
    Java Consultant / Pragmatist / Open Source Enthousiast / Author


    Pro Spring MVC: With Web Flow
    Conspect

    Have you read the reference guide.
    Use the [ code ] tags, young padawan

  4. #4
    Join Date
    Nov 2011
    Posts
    11

    Default

    Quote Originally Posted by Marten Deinum View Post
    Don't use the HibernateTransactionManager use the JpaTransactionManager. Use the correct TransactionManager for the technology you use.
    thank you for the answer Martin,

    I was using the JpaTransactionManager and then I thought that was the reason for the error then I switched to the HibernateTransactionManager.
    I´m getting the same Error / Exception with the JpaTransactionManager

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

  5. #5
    Join Date
    Jun 2006
    Location
    The Netherlands
    Posts
    13,695

    Default

    Why on earth are you first using a query to update a foreign key and then remove it, that means your database and in memory model are out of sync, next to that it seems like some ugly hack to me.
    Marten Deinum
    Java Consultant / Pragmatist / Open Source Enthousiast / Author


    Pro Spring MVC: With Web Flow
    Conspect

    Have you read the reference guide.
    Use the [ code ] tags, young padawan

  6. #6
    Join Date
    Nov 2011
    Posts
    11

    Default

    Quote Originally Posted by Marten Deinum View Post
    Why on earth are you first using a query to update a foreign key and then remove it, ...
    Bottom line: I´m setting all references to Null before deleting the persistentObject. I didn´t post all the test code because of the code length i debugged the Error and it occurs at --> session.delete ( persistentObject );
    I have approximately 30 testcases and everything is working fine, except the tests where I try to delete something. In that case the InvalidDataAccessApiUsageException is thrown.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •