2012-12-17 9 views
5

Ich habe Probleme mit der Persistenz in meinem jBPM-Projekt.Konfigurieren von Persistenz und ORM mit JPA 2

Meine Konfiguration ist JBPM 5.4 + Hibernate + JPA 2, und ich bin gerade dabei, den Prozessablauf zu konfigurieren, um eine Verbindung zu einer Datenbank mit persistence, durch persistence.xml. Ich versuche nur die Standard-Datenquelle (in dem H2-Server) mit meiner benutzerdefinierten persistence.xml zu verbinden, aber ich bekomme immer wieder die gleichen Fehler immer und immer wieder:

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

ich manuell hinzugefügt habe meinen src/META-INF den Ordner JBPMorm-JPA2.xml den folgenden Inhalt, aber der Fehler besteht weiterhin. Kann mir jemand helfen?

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:

Um dies zu lösen, ist ein ProcessInstanceInfo.hbm.xml im META erstellen -INF-Ordner mit folgendem Inhalt:

<?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> 

Wenn jemand ein gutes Tutorial über die Konfiguration der Persistenz für jBPM5 kennt, bitte teilen ... das ist verrückt!

Antwort

7

Ok, geht so hier ein kleines Tutorial Persistenz in JBPM zu konfigurieren, mit einer MySQL-Datenbank und JBoss AS:

1) Erstellen Sie einen Ordner META-INF unter Ihrem src/main/java-Ordner

2) erstellen 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) erstellen 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) Erstellen 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) Jetzt müssen Sie Ihre Datenquelle definieren. Ich benutze JBoss5 und diese Version von JBoss liest jede Datei mit dem Muster * -ds.xml als Definition Ihrer Datenquelle. Sie müssen diese Datei in Ihren Bereitstellungsordner legen (und Sie werden vielleicht feststellen, dass dort bereits eine Datenquellendatei vorhanden ist, aber es wird keine Konflikte geben). Wenn Sie JBoss7 verwenden, gibt es eine andere Möglichkeit, den DS zu definieren - ich nehme an, dies könnte hilfreich sein https://community.jboss.org/wiki/DataSourceConfigurationInAS7.

Wie auch immer, hier ist das, was Ihr yourDS-ds.xml aussehen sollte:

in der Datenbank
<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) Die oben genannten Anweisungen genug sind, um zumindest zu schaffen die Persistenz-Tabellen. Wenn Sie eventuell mit der Verwendung von Aufgaben in JBPM beginnen, müssen Sie möglicherweise eine Datei mit dem Namen "Taskorm.xml" erstellen (googlen Sie sie, sie ist zu lang). Ich bin mir nicht sicher, ob es notwendig ist, aber ich habe es trotzdem.

7) Abschließend rufen Sie Ihre Persistenzeinheit in Java über die EntityManagerFactory auf, erstellen Sie Ihre Umgebung und starten Sie eine neue Sitzung. Die Persistenzdaten sollten automatisch in der Datenbank gespeichert werden.

Ich hoffe, das war hilfreich. Prost!

+0

Ich war im Urlaub, Entschuldigung, ich konnte nicht früher antworten. Sie speichern die Datei "orm.xml" im Ordner "META-INF" unter Ihrem Ordner "src/main/java" –