2 Replies Latest reply on Oct 20, 2012 11:00 AM by Mohamed Abuthahir

    jBpm 5.2 persistence problem - Oracle - Unknown entity: org.drools.persistence.info.SessionInfo

    Samrat Roy Newbie

      Hi , I am setting up jBpm 5.2 with persistence for the first time and facing a LoT of issues. I am using jpm 5.2 with Spring 3.0 and Hibernate 3.5.6 on jBoss AS 7 server.

       

      We all know that jBoss AS 7 comes with Hibernate 4 as the default hibernate , but I need to use the Hibernate 3 in my project so I installed hibernate 3 as a module in as7 and that is working as expected . I excluded Hibernate 4 with jboss-deployment-structure.xml and added org.jboss.as.jpa.hibernate:3 as a dependency in manifest.mf [refer here how I added hibernate:3 as a module in AS7]

       

      That said , I have configured the entire knowledge base and knowledge session in spring so that I dont have to write code for that - Taking tips from drools - integration module and by using drools-grid-impl jar and drools-spring jar.

       

      Drools-grid jar contains a persistence.xml which used in memory DB [h2] so I modified the xml to use oracle and hibernate 3 instead.

       

      Here is my application context:

       

          <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="datasource">

           <property name="jpaVendorAdapter">

               <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:database="${jpa.database}" p:showSql="${jpa.showSql}"/>

           </property>

           <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>

          </bean>

         <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

              <property name="entityManagerFactory" ref="entityManagerFactory" />

          </bean>

         

          <tx:annotation-driven transaction-manager="transactionManager"/>

         

          <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

          <!-- First: declare JBPM JPA Session with a process definition -->

        <jbpm:kbase id="kbase">

          <jbpm:resources>

             <jbpm:resource type="BPMN2" source="classpath:LeaveFlow.bpmn" />

          </jbpm:resources>

        </jbpm:kbase>

        <jbpm:ksession id="ksession" type="stateful" kbase="kbase">

          <jbpm:configuration>

            <jbpm:jpa-persistence>

              <jbpm:entity-manager-factory ref="entityManagerFactory"/>

              <jbpm:transaction-manager ref="transactionManager"/>

            </jbpm:jpa-persistence>

          </jbpm:configuration>

        </jbpm:ksession>

       

        <!-- Declare a TaskServer -->

        <bean class="org.jbpm.task.service.TaskService" id="taskService">

          <constructor-arg ref="entityManagerFactory"/>

          <constructor-arg>

            <bean class="org.drools.SystemEventListenerFactory" factory-method="getSystemEventListener"/>

          </constructor-arg>

        </bean>

        <bean class="org.jbpm.task.service.mina.MinaTaskServer" id="taskServer">

          <constructor-arg ref="taskService"/>

          <constructor-arg><value>${jbpm.task.server.port}</value></constructor-arg>

        </bean>

        <!-- And start TaskServer on the configured port -->

        <bean class="java.lang.Thread" id="taskServerThread" init-method="start">

          <constructor-arg ref="taskServer"/>

        </bean>

       

        <!-- Declare a TaskClient -->

        <bean class="org.jbpm.task.service.mina.MinaTaskClientConnector" id="taskClientConnector">

          <constructor-arg value="taskClient"/>

          <constructor-arg>

            <bean class="org.jbpm.task.service.mina.MinaTaskClientHandler">

              <constructor-arg>

                <bean class="org.drools.SystemEventListenerFactory" factory-method="getSystemEventListener"/>

              </constructor-arg>

            </bean>

          </constructor-arg>

        </bean>

        <bean class="org.jbpm.task.service.TaskClient" id="taskClient">

          <constructor-arg ref="taskClientConnector"/>

        </bean>

       

        <!-- Declare a HumanTaskHandler -->

        <bean class="org.jbpm.task.service.AsyncTaskServiceWrapper"

      id="humanTaskClient">

          <constructor-arg ref="taskClient"/>

        </bean>

        <!-- It uses previously created TaskClient -->

        <bean class="org.jbpm.process.workitem.wsht.SyncWSHumanTaskHandler" id="humanTaskHandler">

          <constructor-arg ref="humanTaskClient"/>

          <constructor-arg ref="ksession"/>

        </bean>

        <!-- Configure its connection to the local server -->

        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="humanTaskHandler" id="setConnection">

          <property name="targetObject" ref="humanTaskHandler"/>

          <property name="targetMethod" value="setConnection"/>

          <property name="arguments">

            <list>

              <value>${jbpm.task.client.address}</value>

              <value>${jbpm.task.client.port}</value>

            </list>

          </property>

        </bean>

        <!-- And connect HumanTaskHandler (implicit TaskClient connection) -->

        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="setConnection">

          <property name="targetObject" ref="humanTaskHandler"/>

          <property name="targetMethod" value="connect"/>

        </bean>

       

        <!-- Finnaly, register HumanTaskHandler in the session -->

        <bean factory-bean="ksession" factory-method="getWorkItemManager" id="workItemManager"/>

        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">

          <property name="targetObject" ref="workItemManager"/>

          <property name="targetMethod" value="registerWorkItemHandler"/>

          <property name="arguments">

            <list>

              <value>Human Task</value>

              <ref bean="humanTaskHandler"/>

            </list>

          </property>

        </bean>

       

      The Exception I am getting while server startup is :

       

      20:07:26,443 ERROR [org.drools.persistence.SingleSessionCommandService] (MSC service thread 1-3) Could not commit session: java.lang.IllegalArgumentException: Unknown entity: org.drools.persistence.info.SessionInfo

          at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:671) [hibernate-entitymanager-3.5.6-Final.jar:3.5.6-Final]

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_23]

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_23]

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_23]

          at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_23]

          at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) [org.springframework.orm-3.0.5.RELEASE.jar:]

          at $Proxy32.persist(Unknown Source)    at org.drools.persistence.jpa.JpaPersistenceContext.persist(JpaPersistenceContext.java:17) [drools-persistence-jpa-5.3.1.Final.jar:]

          at org.drools.persistence.SingleSessionCommandService.<init>(SingleSessionCommandService.java:152) [drools-persistence-jpa-5.3.1.Final.jar:]

          at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [:1.6.0_23]

          at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [:1.6.0_23]

          at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [:1.6.0_23]

          at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [:1.6.0_23]

          at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.buildCommandService(KnowledgeStoreServiceImpl.java:129) [drools-persistence-jpa-5.3.1.Final.jar:]

          at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.newStatefulKnowledgeSession(KnowledgeStoreServiceImpl.java:67) [drools-persistence-jpa-5.3.1.Final.jar:]

          at org.drools.persistence.jpa.JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.java:122) [knowledge-api-5.3.1.Final.jar:]

          at org.drools.container.spring.beans.StatefulKnowledgeSessionBeanFactory.internalAfterPropertiesSet(StatefulKnowledgeSessionBeanFactory.java:85) [drools-spring-5.3.0.Final.jar:]

          at org.drools.container.spring.beans.AbstractKnowledgeSessionBeanFactory.afterPropertiesSet(AbstractKnowledgeSessionBeanFactory.java:123) [drools-spring-5.3.0.Final.jar:]

          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) [org.springframework.beans-3.0.5.RELEASE.jar:]

         .......

       

      This is driving me nuts as I have all the required jars in my classPath. Please help !!!

       

      I am attaching important config files :

      Application Ctxt of my application , MANIFEST.MF of my application , persistence.xml from my application and the persistence.xml which I modified in drools-grid jar