5

jBPMプロジェクトでPersistenceを使用する際に問題が発生しました。

私の構成はjBPM5.4+ Hibernate + JPA 2であり、現在、persistence.xmlを介して永続性を使用してDBに接続するためのプロセスフローを設定しています。デフォルトのデータソース(H2サーバー内)をカスタムpersistence.xmlに接続しようとしていますが、同じエラーが何度も発生します。

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

src / META-INFフォルダーにJBPMorm-JPA2.xmlに次のコンテンツを手動で追加しましたが、エラーが引き続き発生します。誰か助けてもらえますか?

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>

アップデート:

これを解決するには、META-INFフォルダーに次の内容の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>

jBPM5の永続性を構成するための優れたチュートリアルを誰かが知っている場合は、共有してください...これは非常識です!

4

1 に答える 1

7

では、MySQLデータベースとJBoss ASを使用して、JBPMで永続性を設定するための簡単なチュートリアルを次に示します。

1)src / main/javaフォルダーの下にMETA-INFフォルダーを作成します

2)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)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)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)次に、データソースを定義する必要があります。私はJBoss5を使用していますが、このバージョンのJBossは、データソースの定義としてパターン*-ds.xmlを持つすべてのファイルを読み取ります。このファイルをデプロイフォルダーに配置する必要があります(データソースファイルが既に存在することに気付くかもしれませんが、競合は発生しません)。JBoss7を使用している場合、DSを定義する別の方法があります-これは役立つかもしれないと思いますhttps://community.jboss.org/wiki/DataSourceConfigurationInAS7

とにかく、yourDS-ds.xmlは次のようになります。

<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)上記の手順は、少なくともデータベースに永続テーブルを作成するのに十分です。最終的にJBPMでタスクの使用を開始するときに、Taskorm.xmlファイルを作成する必要がある場合があります(グーグル、長すぎます)。必要かどうかはわかりませんが、とにかく持っています。

7)最後に、EntityManagerFactoryを介してJavaで永続ユニットを呼び出し、環境を作成して新しいセッションを開始します。永続性データは自動的にDBに保存されます。

これがお役に立てば幸いです。乾杯!

于 2013-02-08T09:45:35.063 に答える