Package org.kie.internal.persistence.jpa

## Class JPAKnowledgeService

- java.lang.Object
- - org.kie.internal.persistence.jpa.JPAKnowledgeService

-     public class JPAKnowledgeService
      extends java.lang.Object

  Long term out of the box persistence of runtime state with JPA is possible with Drools and jBPM. You will need to configure a JPA entity manager (e.g. using hibernate) and have a JTA transaction manager (for development/testing purposes we recommend Bitronix as it's simple to setup and works embedded, but for production the use of JBoss Transactions is recommended).

       Environment env = KnowledgeBaseFactory.newEnvironment();
       env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory( "emf-name" ) );
       env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager() );

       StatefulKnowledgeSession ksession = JPAKnowledgeService.newKieSession( kbase, null, env ); // KnowledgeSessionConfiguration may be null, and a default will be used
       int sessionId = ksession.getId();

       ksession.insert( data1 );
       ksession.insert( data2 );
       ksession.startProcess( "process1" );

  To use a JPA the Environment must be set with both the EntityManagerFactory and the TransactionManager. If rollback occurs the ksession state is also rolled back, so you can continue to use it after a rollback. To load a previous persisted StatefulKnowledgeSession you'll need the id, as shown below:

       StatefulKnowledgeSession ksession = JPAKnowledgeService.loadKieSession( sessionId, kbase, null, env );

  If you do not define any transaction boundaries, each command (i.e. each invocation of a method of the session) will be executed inside its own transaction. You can define the transaction boundaries yourself using a JTA UserTransaction.

       UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
       ut.begin();
       ksession.insert( data1 );
       ksession.insert( data2 );
       ksession.startProcess( "process1" );
       ut.commit();

  To enable persistence the following classes must be added to your persistence.xml, as in the example below:

       <persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA">
          <provider>org.hibernate.ejb.HibernatePersistence</provider>
          <jta-data-source>jdbc/BitronixJTADataSource</jta-data-source>
          <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
          <class>org.kie.api.persistence.info.ProcessInstanceInfo</class>
          <class>org.kie.api.persistence.info.WorkItemInfo</class>
          <properties>
                <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
                <property name="hibernate.max_fetch_depth" value="3"/>
                <property name="hibernate.hbm2ddl.auto" value="update" />
                <property name="hibernate.show_sql" value="true" />
                <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
          </properties>
       </persistence-unit>

  The jdbc JTA data source would need to be previously bound, Bitronix provides a number of ways of doing this and it's docs shoud be contacted for more details, however for quick start help here is the programmatic approach:

       PoolingDataSource ds = new PoolingDataSource();
       ds.setUniqueName( "jdbc/BitronixJTADataSource" );
       ds.setClassName( "org.h2.jdbcx.JdbcDataSource" );
       ds.setMaxPoolSize( 3 );
       ds.setAllowLocalTransactions( true );
       ds.getDriverProperties().put( "user", "sa" );
       ds.getDriverProperties().put( "password", "sasa" );
       ds.getDriverProperties().put( "URL", "jdbc:h2:mem:mydb" );
       ds.init();

  Bitronix also provides a simple embedded JNDI service, ideal for testing, to use it add a jndi.properties file at the root of your classpath and add the following line to it:

       java.naming.factory.initial=bitronix.tm.jndi.BitronixInitialContextFactory

- - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `JPAKnowledgeService()` |

  - ### Method Summary

    All Methods Static Methods Concrete Methods Deprecated Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `static StatefulKnowledgeSession` | `loadStatefulKnowledgeSession​(int id, org.kie.api.KieBase kbase, org.kie.api.runtime.KieSessionConfiguration configuration, org.kie.api.runtime.Environment environment)` | Deprecated.
    `static StatefulKnowledgeSession` | `loadStatefulKnowledgeSession​(java.lang.Long id, org.kie.api.KieBase kbase, org.kie.api.runtime.KieSessionConfiguration configuration, org.kie.api.runtime.Environment environment)` |
    `static StatefulKnowledgeSession` | `newStatefulKnowledgeSession​(org.kie.api.KieBase kbase, org.kie.api.runtime.KieSessionConfiguration configuration, org.kie.api.runtime.Environment environment)` |

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### JPAKnowledgeService

          public JPAKnowledgeService()

  - ### Method Detail

    - #### newStatefulKnowledgeSession

          public static StatefulKnowledgeSession newStatefulKnowledgeSession​(org.kie.api.KieBase kbase,
                                                                             org.kie.api.runtime.KieSessionConfiguration configuration,
                                                                             org.kie.api.runtime.Environment environment)

    - #### loadStatefulKnowledgeSession

          @Deprecated
          public static StatefulKnowledgeSession loadStatefulKnowledgeSession​(int id,
                                                                              org.kie.api.KieBase kbase,
                                                                              org.kie.api.runtime.KieSessionConfiguration configuration,
                                                                              org.kie.api.runtime.Environment environment)

      Deprecated.
      Deprecated use `loadStatefulKnowledgeSession(Long, KieBase, KieSessionConfiguration, Environment)` instead

    - #### loadStatefulKnowledgeSession

          public static StatefulKnowledgeSession loadStatefulKnowledgeSession​(java.lang.Long id,
                                                                              org.kie.api.KieBase kbase,
                                                                              org.kie.api.runtime.KieSessionConfiguration configuration,
                                                                              org.kie.api.runtime.Environment environment)