Raf*_*tos 5 persistence hibernate jbpm jpa-2.0
我在jBPM项目中使用Persistence时遇到了一些麻烦.
我的配置是jBPM 5.4 + Hibernate + JPA 2,我目前正在设置流程,通过persistence.xml连接到具有持久性的数据库.我只是尝试将默认数据源(在H2服务器中)与我的自定义persistence.xml连接,但我一遍又一遍地得到相同的错误:
Unknown entity: org.jbpm.persistence.processinstance.ProcessInstanceInfo
Run Code Online (Sandbox Code Playgroud)
我已经手动将我的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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
更新:
要解决此问题,请在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>
Run Code Online (Sandbox Code Playgroud)
如果有人知道为jBPM5配置持久性的好教程请分享......这太疯狂了!
好的,所以这里有一个小教程,使用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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
5)现在你必须定义你的数据源.我使用JBoss5,这个版本的JBoss将读取任何带有模式*-ds.xml的文件作为数据源的定义.您必须将此文件放在deploy文件夹中(您可能会注意到那里已存在数据源文件,但不存在冲突).如果你正在使用JBoss7,那么有一种不同的方式来定义DS - 我想这可能会有所帮助https://community.jboss.org/wiki/DataSourceConfigurationInAS7.
无论如何,这是你的你的DS-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>
Run Code Online (Sandbox Code Playgroud)
6)上述说明足以至少在数据库中创建持久性表.当你最终开始在JBPM中使用任务时,可能需要创建一个Taskorm.xml文件(google it,它太长了).我不确定是否有必要,但无论如何我都拥有它.
7)最后,只需通过EntityManagerFactory在Java中调用持久性单元,创建环境并启动新会话.持久性数据应自动保存到DB.
希望这有用.干杯!
归档时间: |
|
查看次数: |
16703 次 |
最近记录: |