Announcement Announcement Module
Collapse
No announcement yet.
InvalidDataAccessApiUsageException after switchin from sessionFactory to EntityManage Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    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
    ...

    Comment


    • #3
      Don't use the HibernateTransactionManager use the JpaTransactionManager. Use the correct TransactionManager for the technology you use.

      Comment


      • #4
        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.
        Im 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>

        Comment


        • #5
          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.

          Comment


          • #6
            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: Im setting all references to Null before deleting the persistentObject. I didnt 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.

            Comment


            • #7
              Also why on earth are you using a session?! You are using JPA use an entity manager?!

              Comment


              • #8
                Originally posted by Marten Deinum View Post
                Also why on earth are you using a session?! You are using JPA use an entity manager?!
                the application has 20 DAOs, each DAO has several access methods which all are based on the Sessionfactory. Thats why I use this line in my beans.xml:

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

                I can switch all DAOs to use the EntityManager but this will take several days, thatswhy it would be great if I can find a way to avoid the InvalidDataAccessApiUsageException. And it is a great pity if ihave to go that way only because of tow testcases.

                Everything worked fine with the sessionFactory from "org.springframework.orm.hibernate3.LocalSessionFa ctoryBean" but I wanna use the spring data jpa project in my application which is based on JPA and the EntityManager. Therefor I tried to create the sessionFactory out of org.springframework.orm.jpa.LocalContainerEntityMa nagerFactoryBean.

                Comment

                Working...
                X