2012-12-17 14 views
5

Mam problemy z używaniem trwałości w moim projekcie jBPM.Konfigurowanie trwałości i orm z JPA 2

Moja konfiguracja to jBPM 5.4 + Hibernuj + JPA 2 i obecnie konfiguruję przepływ procesu, aby połączyć się z bazą danych z zachowaniem, poprzez persistence.xml. Po prostu staram się połączyć źródło danych domyślnych (na serwerze H2) z moim niestandardowym persistence.xml, ale wciąż otrzymuję ten sam błąd w kółko:

Unknown entity: org.jbpm.persistence.processinstance.ProcessInstanceInfo 

Mam ręcznie dodane do mojego src/META-INF folder JBPMorm-JPA2.xml następujące treści, ale błąd nadal występuje. Czy ktoś może mi pomóc?

JBPMorm-JPA2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd" 
       version="2.0"> 
     <named-query name="ProcessInstancesWaitingForEvent"> 
      <query> 
select 
    processInstanceInfo.processInstanceId 
from 
    ProcessInstanceInfo processInstanceInfo join processInstanceInfo.eventTypes eventTypes 
where 
    eventTypes = :type 
      </query> 
     </named-query> 

     <!-- ProcessInstanceInfo mapping (needed for JPA 2) --> 

     <entity class="org.jbpm.persistence.processinstance.ProcessInstanceInfo" 
       metadata-complete="true"> 
     <pre-update method-name="update" /> 
     <attributes> 
      <id name="processInstanceId"> 
       <column name="InstanceId" /> 
       <generated-value strategy="AUTO"/> 
      </id> 
      <basic name="processId" access="FIELD" /> 
      <basic name="startDate" access="FIELD" > 
       <temporal>DATE</temporal> 
      </basic> 
      <basic name="lastReadDate" access="FIELD" > 
       <temporal>DATE</temporal> 
      </basic> 
      <basic name="lastModificationDate" access="FIELD" > 
       <temporal>DATE</temporal> 
      </basic> 
      <basic name="state" access="FIELD" /> 
      <basic name="processInstanceByteArray" access="FIELD" > 
       <lob/> 
      </basic> 
      <version name="version" access="FIELD" > 
       <column name="OPTLOCK" /> 
      </version> 
      <element-collection name="eventTypes" target-class="java.lang.String" access="FIELD" > 
       <collection-table name="EventTypes"> 
        <join-column name="InstanceId"/> 
       </collection-table> 
      </element-collection> 
      <transient name="processInstance" /> 
      <transient name="env" /> 
     </attributes> 
     </entity> 

</entity-mappings> 

persistence.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<persistence 
    version="1.0" 
    xsi:schemaLocation= 
    "http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd 
    http://java.sun.com/xml/ns/persistence/orm 
    http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" 
    xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/persistence"> 

    <persistence-unit name="IALPR" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>jdbc/jbpm-ds</jta-data-source> 
    <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.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> 

</persistence> 

UPDATE:

Aby rozwiązać ten problem, należy utworzyć ProcessInstanceInfo.hbm.xml w meta -INF folder o następującej treści:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="org.jbpm.persistence.processinstance"> 

    <!-- access="field" for fields that have no setter methods --> 
    <class name="ProcessInstanceInfo" table="ProcessInstanceInfo"> 

     <id name="processInstanceId" type="long" column="InstanceId"> 
      <generator class="native" /> 
     </id> 

     <version name="version" type="integer" unsaved-value="null" access="field"> 
      <column name="OPTLOCK" not-null="false" /> 
     </version> 

     <property name="processId" access="field" /> 
     <property name="startDate" type="timestamp" access="field" /> 
     <property name="lastReadDate" type="timestamp" access="field" /> 
     <property name="lastModificationDate" type="timestamp" access="field" /> 
     <property name="state" type="integer" not-null="true" access="field" /> 

     <property name="processInstanceByteArray" type="org.hibernate.type.PrimitiveByteArrayBlobType" 
      column="processInstanceByteArray" access="field" length="2147483647" /> 

     <set name="eventTypes" table="EventTypes" access="field" > 
      <key column="InstanceId"/> 
      <element column="element" type="string"/> 
     </set> 

     <!-- NOT mapping [processInstance] field because field is transient -->  
     <!-- NOT mapping [env] field because field is transient -->  

    </class> 

</hibernate-mapping> 

Jeśli ktoś zna dobry samouczek dotyczący konfigurowania trwałości dla jBPM5, proszę podziel się ... to jest szalone!

Odpowiedz

7

Ok, więc tutaj idzie mały samouczek skonfigurować wytrwałości w jBPM, przy użyciu bazy danych MySQL i JBoss AS:

1) Utwórz folder META-INF pod folderze src/main/java

2) Tworzenie persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
      xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"> 

    <persistence-unit name="your_unit_name" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:/your_data_source_name</jta-data-source>   
     <mapping-file>META-INF/JBPMorm.xml</mapping-file> 
     <mapping-file>META-INF/ProcessInstanceInfo.hbm.xml</mapping-file> 

     <!-- The tables that will be created in your specified sql schema --> 
     <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.default_schema" value="your_schema_name" /> 

      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
      <property name="hibernate.connection.autocommit" value="false" /> 
      <property name="hibernate.max_fetch_depth" value="3"/> 
      <property name="hibernate.hbm2ddl.auto" value="create" /> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 

     </properties>   
    </persistence-unit> 





</persistence> 

3) Tworzenie orm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd" 
    version="1.0"> 
    <named-query name="ProcessInstancesWaitingForEvent"> 
     <query> 
      select 
      processInstanceInfo.processInstanceId 
      from 
      ProcessInstanceInfo processInstanceInfo 
      where 
      :type in elements(processInstanceInfo.eventTypes) 
      </query> 
    </named-query> 

</entity-mappings> 

4) Utwórz ProcessInstanceInfo.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > 
<hibernate-mapping package="org.jbpm.persistence.processinstance"> 

    <!-- access="field" for fields that have no setter methods --> 
    <class name="ProcessInstanceInfo" table="ProcessInstanceInfo"> 

     <id name="processInstanceId" type="long" column="InstanceId"> 
      <generator class="native" /> 
     </id> 

     <version name="version" type="integer" unsaved-value="null" access="field"> 
      <column name="OPTLOCK" not-null="false" /> 
     </version> 

     <property name="processId" access="field" /> 
     <property name="startDate" type="timestamp" access="field" /> 
     <property name="lastReadDate" type="timestamp" access="field" /> 
     <property name="lastModificationDate" type="timestamp" access="field" /> 
     <property name="state" type="integer" not-null="true" access="field" /> 

     <property name="processInstanceByteArray" type="org.hibernate.type.PrimitiveByteArrayBlobType" 
      column="processInstanceByteArray" access="field" length="2147483647" /> 

     <set name="eventTypes" table="EventTypes" access="field" > 
      <key column="InstanceId"/> 
      <element column="element" type="string"/> 
     </set> 

     <!-- NOT mapping [processInstance] field because field is transient -->  
     <!-- NOT mapping [env] field because field is transient -->  

    </class> 

</hibernate-mapping> 

5) Teraz musisz zdefiniować swoje źródło danych. Używam JBoss5, a ta wersja JBoss odczyta dowolny plik z wzorcem * -ds.xml jako definicją twojego źródła danych. Musisz umieścić ten plik w folderze wdrażania (możesz zauważyć, że istnieje już plik z danymi źródłowymi, ale nie będzie żadnych konfliktów). Jeśli używasz JBoss7, istnieje inny sposób definiowania DS - Przypuszczam, że może to być pomocne https://community.jboss.org/wiki/DataSourceConfigurationInAS7.

W każdym razie, oto co się yourDS-ds.xml powinna wyglądać następująco:

<datasources> 
    <local-tx-datasource> 
    <jndi-name>jdbc/your_datasource_name</jndi-name> 
    <connection-url>your_db_url</connection-url> 
    <driver-class>com.mysql.jdbc.Driver</driver-class> 
    <user-name>your_user</user-name> 
    <password>your_pass</password> 
    <min-pool-size>5</min-pool-size> 
    <max-pool-size>20</max-pool-size> 
    <idle-timeout-minutes>5</idle-timeout-minutes> 
    </local-tx-datasource> 
</datasources> 

6) Powyższe wskazówki są wystarczające, by przynajmniej stworzyć tabele utrzymywanie się w bazie danych. Kiedy w końcu zaczniesz używać zadań w JBPM, może być wymagane utworzenie pliku Taskorm.xml (google it, to zbyt długo). Nie jestem pewien, czy to konieczne, ale i tak mam.

7) Na koniec wystarczy zadzwonić do jednostki trwałości w Javie za pośrednictwem EntityManagerFactory, utworzyć środowisko i rozpocząć nową sesję. Dane trwałości powinny być automatycznie zapisywane w DB.

Mam nadzieję, że to było pomocne. Twoje zdrowie!

+0

Nie było mnie na urlopie, przepraszam, nie mogłem odpowiedzieć wcześniej. Zapisz plik orm.xml w folderze META-INF w folderze src/main/java –

Powiązane problemy