圖6.1. 不同形態的轉換
流程定義可以用三種不同的形式表現

有關XML表示流程定義和流程檔案可以參看 第13章, jBPM 流程定義語言 (JPDL).
本章討論java Object和jBPM數據庫之間的轉換.jBPM內部hibernate 保存java objects到數據庫并且重現他們 . 當然不是嚴格限定使用jBPM必須有hibernate 的相關知識,這只是推薦使用hibernate.
更多的有關如何發布流程檔案到數據庫親參看 13.1.1節, “發布流程檔案”
6.1. 永久化API
圖 6.2. The jBPM 數據庫class
jBPM永久化操作可以根據名字類似 GraphSession, TaskMgmtSession 和 ContextSession等來找到 .從 JbpmSession可以獲得命名的會話 .? JbpmSession 可以從 JbpmSessionFactory獲得.
JbpmSessionFactory 對你的應用程序來說是threadsafe保證的, 你需要一個 JbpmSessionFactory . 單件模式(Singleton)的延遲初始化(Lazy Initialization)(當心 issues延遲載入和double-check locking的問題 ).
在生成時間,? JbpmSessionFactory預備了能讓JbpmSession可以飛快建立的所有信息 .
作為一個用戶, 你可以為每個thread或每個請求建立一個 JbpmSession .? JbpmSession有一個JDBC? connection 連接到數據庫
JbpmSession 和 JbpmSessionFactory僅僅是包裝它們的 hibernate副本. 高級的特性比如獨立的數據For advanced features such as 脫管對象(detached objects)或樂觀鎖定, 參看hibernate文檔.
public class PersistenceApiTest extends TestCase {
? static JbpmSessionFactory jbpmSessionFactory = JbpmSessionFactory.buildJbpmSessionFactory();
? public void testStartProcessInstance() {
??? // obtain a session
??? JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
??? try {
????? // start a user managed transaction
????? jbpmSession.beginTransaction();
????? // load information from the database
????? // (note that process definitions will be cached in memory
????? // in the second level cache of hibernate)
????? ProcessDefinition auctionProcess =
??????? jbpmSession.getGraphSession().findLatestProcessDefinition("auction");
????? // perform a POJO workflow operation on the plain object model.
????? ProcessInstance auctionInstance = new ProcessInstance(auctionProcess);
????? auctionInstance.signal();
?????
????? // store the result in the database
????? jbpmSession.getGraphSession().saveProcessInstance(auctionInstance);
?????
????? // commit the user transaction
????? jbpmSession.commitTransaction();
??? } finally {
????? // close the session.
????? jbpmSession.close();?????
??? }
? }
}
6.2. 數據庫配置
最容易的配置the hibernate SessionFactory 的方式是把 hibernate.cfg.xml 放到根classpath里.? hibernate.cfg.xml 包含了如何獲得jdbc jdbc connections 和定位hibernate mapping 文件. 你可以在目錄test/java發現比如mapping文件的例子.
更多關于配置hibernate的信息可以參看 hibernate 參考手冊l, 配置章節.
6.3. 管理事務
jBPM 基本方式是平衡 hibernate 關于事務分界的能力. 這有兩個最常見的場景來解釋:
用戶事務管理, JbpmSession 有方法
JbpmSession.beginTransaction()
JbpmSession.commitTransaction()
JbpmSession.rollbackTransaction()
這些方法的行為依賴hibernate的有關事務的配置.
如果你配置了hibernate 管理她自己的JDBC connections (比如 C3P0連接池), 那么事務操作的結果同JDBC connection一致. hibernate配置文件中(hibernate.cfg.xml) 配置要求你指明JDBC connection屬性. 可選的, 你可以通過c3p0連接池的屬性來配置連接池.
當你配置了hibernate 獲得connection從應用服務器中的DataSource,那么事務的方法將同包容器中的UserTransaction object的方法保持一致.
更多有關配置事務的細節參看? hibernate 參考手冊, 事務策略章節.
6.4. jBPM 數據庫
jBPM 數據庫包含流程定義,流程執行和日志數據. 流程定義數據是靜態的不能改變(參看 章節13.1.2, “流程版本 . 流程執行是流程定義的參考數據. 流程日志包含了所有在流程執行中的變化信息.
6.4.1. Hibernate 整合
jBPM 使用 hibernate 3.0? 作為它的 O/R映射. 這就意味著hibernate 有負責jBPM java object和這些對象在關系數據庫中永久化對象的變換. 注意你開始使用jBPM不必了解Hibernate . Hibernate用于jBPM內部. 但是理解基本的hibernate, 會幫助你更好理解jBPM API的語義.
讓我們看看一些例子和得到一些hibernate的功能了解:
發布流程檔案 : 發布流程檔案按照幾個步驟, 在第一個步驟, 檔案被解析并且相應的java object模型也被建立. 對象圖將被hibernate處理. Hibernate將產生必要的相關SQL數據庫插入語句 .
更新流程實例 : 另外一個功能是hibernate 臟數據檢查功能. hibernate 在兩個對象圖中間計算不同并產生必要的對應數據庫的update語句 (和插入及刪除) 使java object和數據庫保持一致. 因此當你想繼續流程執行實例, 你使用 ProcessInstance JbpmSession.getGraphSession().loadProcessInstance(Long pid) , jBPM將委托這個調用到 hibernate. Hibernate將從數據庫載入這個流程實例數據并且結構化成jBPM java objects. 在這之后,你可以自由的修改流程實例java objects就好象其他java objects一樣.當你完成 (比如在在執行進入等待狀態之后)后 你可以保存修改過的流程實例到數據庫,通過調用 JbpmSession.getGraphSession().saveProcessInstance(ProcessInstance processInstance) . jBPM 同樣委過這個任務到hibernate , hibernate 將計算給頂的processInstance和 原始從數據庫中載入的processInstance .這叫做臟數據檢查. Hibernate 會計算所有的不同并且產生必要的SQL語句來保證數據庫和java object的同步.
執行這個任務, hibernate 需要一組mapping文件和配置文件. mapping 文件說明了java object 同數據庫table之間的映射. jBPM 包括所有的jBPMdomain class的 mapping 文件.
hibernate配置文件中的主要信息是描述數據庫連接的配置屬性. 包括jdbc連接和數據庫方言. SQL方言是重要的hibernate特性 : 數據庫無關. 數據庫每個類型一般說來都有同樣的SQL, 但不同的數據庫有稍微不同的SQL語法. Hibernate 知道這些區別并通過方言屬性來建立正確的SQL. 可以參考hibernate文檔查看支持的數據庫清單.
6.4.2. 開發數據庫是hsqldb
hypersonic數據庫是理想的包含關系數據庫的java軟件的數據庫. 尤其是 hypersonic in-memory 模型是非常便于編寫包含數據操作的test unit . hypersonic in-memory 數據庫保持所有的數據在內存中而不是保存在磁盤里. jBPM的單元測試將開始一個干凈的空的in-memory數據庫. 然后hibernate schema 生成工具將建立jBPM table. 我們提供的jBPM類mapping文件作為hibernate schema生成器的輸入. 然后hibernate schema 生成器根據信息生成數據庫schema (DDL)腳本. 這些DDL 語句將在hypersonic in-memory數據庫上執行用來建立新的,空的jBPM 數據庫.
6.4.3. 其他數據庫支持
為了支持除了hypersonic in-memory 數據庫而提供了jbpm 數據庫擴展包: jbpm-<version>-db.zip . 參看 章節2.1, “可下載一覽” . 這個包報案ant 腳本來測試jBPM是否為支持的不同的數據庫產生數據庫的DDL腳本 (create, drop和clean)
在展開 jbpm-<version>-db.zip , 更新 build.properties并且設置 jbpm.3.location 到安裝jbpm的主目錄(相對路徑或絕對路徑)
數據包擴展包包括一個ant建造script (build.xml ) 在根目錄下. 這個腳本包括建立jBPM支持的數據庫生成腳本和測試腳本.運行 ant -p 得到關于建造目標更多的信息.? readme.html文件介紹了更多的有關不同數據庫實現的信息及狀態.
生成的腳本是默認的腳本.如果想為特定的使用定制或優化 , 你必須詢問你的DBA 先查看數據庫腳本. 通常的定制是額外的索引或增加text字段的最大值.
如果你的數據庫不被支持,你可以用我們介紹的方法在你的數據庫上來測試jBPM . 我們希望支持所有的數據庫,所以可以把你的數據庫的下列信息讓我們知道.:
jbpm.test.hibernate.properties 配置文件
那里可以下載數據庫驅動和數據庫版本
你碰到的任何問題
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
