10 Replies Latest reply on Jul 19, 2013 2:48 AM by thomas.setiabudi

    Persistence and Transaction Management

    mpiraccini

      Hi Guys,

       

      I have a very strange behaviour with JBPM5.1 and the persistence.

      I do not specify the TransactionManager in the Environment, but i set only the EntityManager. That seems to be correct, looking at the documentation (see 7.1.3 - Configuring Persistence).

      My persistence unit is configured in that way:

       

      <persistence-unit name="org.jbpm.persistence.jpa" transaction-type="RESOURCE_LOCAL">

         <class>org.drools.persistence.info.SessionInfo</class>

         <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>

         <class>org.drools.persistence.info.WorkItemInfo</class>

         <properties>

                <property name="hibernate.hbm2ddl.auto" value="create-drop" />

                <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />

                <property name="hibernate.connection.username" value="xx" />

                <property name="hibernate.connection.password" value="xx" />

                <property name="hibernate.show_sql" value="true" />

                <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:test" />                           

                <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>

                <property name="hibernate.max_fetch_depth" value="3"/>

                <property name="hibernate.show_sql" value="true"/>

         </properties>

      </persistence-unit>

       

      The strange behaviour is that, when I try to run the code from a junit test using:

       

      Environment env = KnowledgeBaseFactory.newEnvironment();

      env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );

      JPAKnowledgeService.newStatefulKnowledgeSession(knowledgeBase, getKnowledgeSessionConfiguration(),env);

       

      I get this NPE:

      18:39:06,775 ERROR [persistence.SingleSessionCommandService] Could not commit session

      java.lang.NullPointerException

          at org.drools.persistence.jta.JtaTransactionManager.getStatus(JtaTransactionManager.java:197)

          at org.drools.persistence.jta.JtaTransactionManager.begin(JtaTransactionManager.java:150)

          at org.drools.persistence.SingleSessionCommandService.<init>(SingleSessionCommandService.java:120)

          at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

          at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

          at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

          at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

          at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.buildCommanService(KnowledgeStoreServiceImpl.java:116)

          at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.newStatefulKnowledgeSession(KnowledgeStoreServiceImpl.java:54)

          at org.drools.persistence.jpa.JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.java:122)

       

      There are some quite strange issues about that:

      1) Why it uses the JtaTransactionManager even if the transaction-type is "RESOURCE_LOCAL"?

      2) If I take a look at the JtaTransactionManager code, the NPE occurs because the UserTransaction is null. That's true, since no-one creates it! Indeed, looking at the SingleSessionCommandService method, the JtaTransactionManager is created in that way:

       

      this.txm = new JtaTransactionManager( env.get( EnvironmentName.TRANSACTION ),

                                                            env.get( EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY ),

                                                            tm );

       

      ...so, I have to specify the EnvironmentName.TRANSACTION to avoid the NPE? If so, why?

       

      Thank you,

       

      Marco.