這篇文章主要講解了“如何配置工作流引擎Activiti集成JPA持久化保存流程數(shù)據(jù)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何配置工作流引擎Activiti集成JPA持久化保存流程數(shù)據(jù)”吧!
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),宣威企業(yè)網(wǎng)站建設(shè),宣威品牌網(wǎng)站建設(shè),網(wǎng)站定制,宣威網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,宣威網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
可以使用JPA實(shí)體作為流程變量,并進(jìn)行操作:
基于流程變量更新已有的JPA實(shí)體,可以在用戶任務(wù)的表單中填寫或者由服務(wù)任務(wù)生成
重用已有的領(lǐng)域模型,不需要編寫顯示的服務(wù)獲取實(shí)體或者更新實(shí)體的值
根據(jù)已有實(shí)體的屬性做出判斷(網(wǎng)關(guān)即分支聚合)
Activiti中JPA只支持符合以下要求的實(shí)體:
Id字段或者屬性能夠使用JPA規(guī)范支持的任意類型:
原生態(tài)數(shù)據(jù)類型和他們的包裝類型(Boolean除外)
String
BigInteger
BigDecimal
java.util.Date
java.sql.Date
實(shí)體應(yīng)該使用JPA注解進(jìn)行配置,支持字段和屬性訪問兩種方式.@MappedSuperclass也要能夠被使用
實(shí)體中應(yīng)該有一個(gè)使用@Id注解的主鍵,不支持復(fù)合主鍵@EmbeddedId 和 @IdClass:
引擎必須有一個(gè)對(duì)EntityManagerFactory的引用才能夠使用JPA的實(shí)體,這樣可以通過配置引用或者提供一個(gè)持久化單元名稱
作為變量的JPA實(shí)體將會(huì)被自動(dòng)檢測并進(jìn)行相應(yīng)的處理
使用jpaPersistenceUnitName配置:
配置一個(gè)自定義的EntityManagerFactory,
這里使用了OpenJPA實(shí)體管理器
該代碼片段僅僅包含與例子相關(guān)的beans,去掉了其他beans.
OpenJPA實(shí)體管理的完整并可以使用的例子可以在activiti-spring-examples(/activiti-spring/src/test/java/org/activiti/spring/test/jpa/JPASpringTest.java)中找到
也可以在編程式創(chuàng)建一個(gè)引擎時(shí)完成配置:
ProcessEngine processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResourceDefault() .setJpaPersistenceUnitName("activiti-pu") .buildProcessEngine();
配置的屬性有:
jpaPersistenceUnitName:使用持久化單元的名稱:
要確保該持久化單元在類路徑下是可用的,默認(rèn)的路徑是 /META-INF/persistence.xml
要么使用jpaEntityManagerFactory要么或者是jpaPersistenceUnitName
jpaEntityManagerFactory:一個(gè)實(shí)現(xiàn)了javax.persistence.EntityManagerFactory的bean的引用:
將被用來加載實(shí)體并且刷新更新
要么使用jpaEntityManagerFactory要么或者是jpaPersistenceUnitName
jpaHandleTransaction:在被使用的EntityManager實(shí)例上,該標(biāo)記表示流程引擎是否需要開始和提交或者回滾事務(wù):
當(dāng)使用Java事務(wù)API(JTA)時(shí),設(shè)置為false
jpaCloseEntityManager:該標(biāo)記表示流程引擎是否應(yīng)該關(guān)閉從 EntityManagerFactory獲取的EntityManager的實(shí)例:
當(dāng)EntityManager是由容器管理的時(shí)候需要設(shè)置為false:當(dāng)使用并不是單一事務(wù)作用域的擴(kuò)展持久化上下文的時(shí)候
首先,需要?jiǎng)?chuàng)建一個(gè)基于META-INF/persistence.xml的EntityManagerFactory作為持久化單元:包含持久化單元中所有的類和一些供應(yīng)商特定的配置
使用一個(gè)簡單的實(shí)體作為測試,其中包含有一個(gè)id和String類型的value屬性,也將會(huì)被持久化
在測試之前,創(chuàng)建一個(gè)實(shí)體并且保存:
@Entity(name = "JPA_ENTITY_FIELD") public class FieldAccessJPAEntity { @Id @Column(name = "ID_") private Long id; private String value; public FieldAccessJPAEntity() { // Empty constructor needed for JPA } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
啟動(dòng)一個(gè)新的流程實(shí)例,添加一個(gè)實(shí)體作為變量.其他的變量,將會(huì)被存儲(chǔ)在流程引擎的持久化數(shù)據(jù)庫中.下一次獲取該變量的時(shí)候,將會(huì)根據(jù)該類和存儲(chǔ)Id從EntityManager中加載:
Mapvariables = new HashMap (); variables.put("entityToUpdate", entityToUpdate); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("UpdateJPAValuesProcess", variables);
流程定義中的第一個(gè)節(jié)點(diǎn)是一個(gè)服務(wù)任務(wù),將會(huì)調(diào)用entityToUpdate上的setValue方法,其實(shí)就是之前在啟動(dòng)流程實(shí)例時(shí)候設(shè)置的JPA變量并且將會(huì)從當(dāng)前流程引擎的上下文關(guān)聯(lián)的EntityManager中加載:
當(dāng)完成服務(wù)任務(wù)時(shí),流程實(shí)例將會(huì)停留在流程定義中定義的用戶任務(wù)環(huán)節(jié)上:
可以查看該流程實(shí)例
EntityManager已經(jīng)被刷新了并且改變的實(shí)體已經(jīng)被保存進(jìn)數(shù)據(jù)庫中
獲取entityToUpdate的變量value時(shí),該實(shí)體將會(huì)被再次加載并且獲取該實(shí)體屬性的值將會(huì)是updatedValue
// Servicetask in process 'UpdateJPAValuesProcess' should have set value on entityToUpdate. Object updatedEntity = runtimeService.getVariable(processInstance.getId(), "entityToUpdate"); assertTrue(updatedEntity instanceof FieldAccessJPAEntity); assertEquals("updatedValue", ((FieldAccessJPAEntity)updatedEntity).getValue())
以查詢某一JPA實(shí)體作為變量的ProcessInstances和Executions
在ProcessInstanceQuery和ExecutionQuery查詢中僅僅variableValueEquals(name, entity)支持JPA實(shí)體變量:
[variableValueNotEquals],[variableValueGreaterThan],[variableValueGreaterThanOrEqual],[variableValueLessThan],[variableValueLessThanOrEqual]不被支持并且傳遞JPA實(shí)體值的時(shí)候會(huì)拋出一個(gè)ActivitiException
ProcessInstance result = runtimeService.createProcessInstanceQuery().variableValueEquals("entityToQuery", entityToQuery).singleResult();
JPASpringTest,在activiti-spring-examples中:
已經(jīng)存在了一個(gè)使用JPA實(shí)體的Spring-bean,用來存儲(chǔ)貸款申請(qǐng)
使用Activiti,可以通過已經(jīng)存在的bean獲取已經(jīng)使用的實(shí)體,并使用它作為變量用于流程中
流程定義步驟:
當(dāng)申請(qǐng)批準(zhǔn),流程結(jié)束
否則,一個(gè)額外的任務(wù)將會(huì)使用(發(fā)送拒絕信),這樣就可以發(fā)送拒絕信手動(dòng)通知客戶
更新貸款申請(qǐng)實(shí)體,因此該實(shí)體與流程保持同步
允許經(jīng)理查看貸款申請(qǐng),并填入審批意見(同意/不同意)
審批意見將作為一個(gè)boolean變量approvedByManager進(jìn)行存儲(chǔ)
創(chuàng)建一個(gè)新的貸款申請(qǐng),使用已經(jīng)存在的LoanRequestBean接受啟動(dòng)流程時(shí)候的變量(來自流程啟動(dòng)時(shí)候的表單)
使用activiti:resultVariable(作為一個(gè)變量對(duì)表達(dá)式返回的結(jié)果進(jìn)行存儲(chǔ))將創(chuàng)建出來的實(shí)體作為變量進(jìn)行存儲(chǔ)
服務(wù)任務(wù):
用戶任務(wù):
服務(wù)任務(wù):
根據(jù)貸款申請(qǐng)實(shí)體變量approved的值,將利用唯一網(wǎng)關(guān)自動(dòng)決定下一步該選擇那一條路徑:
${loanRequest.approved} ${!loanRequest.approved}
感謝各位的閱讀,以上就是“如何配置工作流引擎Activiti集成JPA持久化保存流程數(shù)據(jù)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何配置工作流引擎Activiti集成JPA持久化保存流程數(shù)據(jù)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!