| 模式 | 特點 | 適用場景 |
|---|---|---|
| 物件模式 | 直接操作 API 物件圖,無資料庫,無事務邊界 | 單元測試、原型驗證、嵌入式無持久化需求 |
| 持久化模式 | 流程定義/執行儲存資料庫,透過 Service API 操作,需事務 | 生產環境、叢集、長期運行流程、審計追蹤 |
| 嵌入式模式 | 執行狀態序列化存入領域物件(如 Loan.execution),由 Hibernate 透明持久化 | 領域模型驅動設計、狀態與業務資料強綁定 |
ClientProcessDefinition pd = ProcessFactory.build("loan")
.activity("submit").initial().behaviour(AutomaticActivity.class)
.transition().to("evaluate")
.activity("evaluate").behaviour(WaitState.class)
.transition("approve").to("wire")
.transition("reject").to("end")
.activity("wire").behaviour(AutomaticActivity.class)
.transition().to("archive")
.activity("archive").behaviour(WaitState.class)
.transition().to("end")
.activity("end").behaviour(WaitState.class)
.done();
ClientExecution exec = pd.startProcessInstance(); // 阻塞至 evaluate
assertEquals("evaluate", exec.getActivityName());
exec.signal("approve"); // 執行 wire → archive
assertEquals("archive", exec.getActivityName());
exec.signal(); // 取預設轉移 → end
assertEquals("end", exec.getActivityName());
environment.cfg.xml + hibernate.properties(見第 14 章)。EnvironmentFactory 取得 ProcessService、ExecutionService、ManagementService。ProcessService.deploy() 部署流程定義(自動版本化)。ExecutionService.startExecution("loan:1", "request7836") 啟動實例,回傳介面而非實體(避免 LazyInitializationException)。ExecutionService.signalExecution(id, "approve") 觸發推進。領域物件內嵌 ClientExecution 欄位,以 Hibernate ExecutionType 自訂類型映射:
public class Loan {
private static final ClientProcessDefinition pd = createLoanProcess();
private ClientExecution execution;
private String customer; private double amount;
public Loan(String customer, double amount) {
this.customer = customer; this.amount = amount;
this.execution = pd.startProcessInstance();
}
public void approve() { execution.signal("approve"); }
public void reject() { execution.signal("reject"); }
public String getState() { return execution.getActivityName(); }
// getters/setters ...
}
Loan.hbm.xml<typedef name="execution" class="org.jbpm.pvm.internal.hibernate.ExecutionType"/>
<class name="Loan" table="LOAN">
<id name="dbid"><generator class="sequence"/></id>
<property name="execution" type="execution"/>
<property name="customer"/>
<property name="amount"/>
</class>
Session s = sf.openSession(); Transaction tx = s.beginTransaction();
Loan loan = new Loan("john doe", 234.0); s.save(loan); // 狀態 evaluate
tx.commit(); s.close();
// 新事務載入並推進
s = sf.openSession(); tx = s.beginTransaction();
loan = (Loan) s.get(Loan.class, loan.getDbid());
loan.approve(); // 狀態 archive
tx.commit(); s.close();
資料庫中 LOAN 表單欄 execution 儲存序列化後的執行狀態,隨業務資料同步持久化。