2012-12-17 42 views
5

Tôi đang gặp sự cố khi sử dụng Persistence trên dự án jBPM của mình.Định cấu hình độ bền và orm với JPA 2

Cấu hình của tôi là jBPM 5.4 + Hibernate + JPA 2 và hiện tôi đang thiết lập quy trình xử lý để kết nối với DB bằng persistence, thông qua persistence.xml. Tôi chỉ đang cố gắng kết nối nguồn dữ liệu mặc định (trong máy chủ H2) với persistence.xml tùy chỉnh của mình, nhưng tôi vẫn nhận được cùng một lỗi lặp đi lặp lại:

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

Tôi đã thêm thủ công vào Thư mục src/META-INF chứa JBPMorm-JPA2.xml nội dung sau, nhưng lỗi vẫn tồn tại. Ai giúp tôi với?

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:

Để giải quyết điều này, tạo một ProcessInstanceInfo.hbm.xml trong META Thư mục -INF, với nội dung sau:

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

Nếu có ai biết hướng dẫn tốt về định cấu hình kiên trì cho jBPM5, vui lòng chia sẻ ... điều này thật điên rồ!

Trả lời

7

Ok, vì vậy ở đây đi một chút hướng dẫn để cấu hình bền bỉ trong jBPM, sử dụng một cơ sở dữ liệu MySQL và JBoss AS:

1) Tạo một thư mục META-INF dưới src chính thư mục của bạn// java

2) Tạo 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) Tạo 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) Tạo 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) Bây giờ bạn phải xác định nguồn dữ liệu của mình. Tôi sử dụng JBoss5 và phiên bản JBoss này sẽ đọc bất kỳ tệp nào có mẫu * -ds.xml như là định nghĩa nguồn dữ liệu của bạn. Bạn phải đặt tệp này vào thư mục triển khai của mình (và bạn có thể nhận thấy đã có tệp nguồn dữ liệu ở đó, nhưng sẽ không có xung đột). Nếu bạn đang sử dụng JBoss7, có một cách khác để xác định DS - Tôi cho rằng điều này có thể hữu ích https://community.jboss.org/wiki/DataSourceConfigurationInAS7.

Dù sao, đây là những gì yourDS-ds.xml của bạn sẽ giống như thế:

<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) Các hướng dẫn ở trên là đủ để ít nhất tạo ra các bảng kiên trì trong cơ sở dữ liệu. Khi bạn bắt đầu sử dụng các tác vụ trong JBPM, có thể cần phải tạo một tệp Taskorm.xml (google nó, quá dài). Tôi không chắc chắn nếu nó là cần thiết, nhưng tôi có nó anyway.

7) Cuối cùng, chỉ cần gọi đơn vị lưu giữ của bạn trong Java thông qua EntityManagerFactory, tạo môi trường của bạn và bắt đầu một phiên mới. Dữ liệu kiên trì sẽ được lưu tự động vào DB.

Hy vọng điều này hữu ích. Chúc mừng!

+0

Tôi đã đi nghỉ, xin lỗi tôi không thể trả lời trước đó. Bạn lưu tệp orm.xml trong thư mục META-INF trong thư mục src/main/java của bạn –

Các vấn đề liên quan