sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`JBPM4_EXECUTION`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY (`INSTANCE_`) REFERENCES `JBPM4_EXECUTION` (`DBID_`))
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1604)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1519)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1504)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2551)
... 34 more
### EXCEPTION ###########################################
10:25:04,540 FIN | [HibernateSessionResource] ----- rolling back hibernate tx 1940445711 -----------------------------------------------------
测试流程如图:
我测试代码是:completeTask
package com.tgb.video;
import java.util.List;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
import junit.framework.TestCase;
public class testJbpm extends TestCase{
/**
* 第1步:部署流程;
*/
public void deploy(){
ProcessEngine processEngine=Configuration.getProcessEngine();//得到流程引擎processEngine,
RepositoryService repositoryService=processEngine.getRepositoryService();//通过流程引擎得到服务
repositoryService.createDeployment().addResourceFromClasspath("test.jpdl.xml").deploy();
}
/**
* 第2步:创建流程实例;
*/
public void createInstance(){
ProcessEngine processEngine=Configuration.getProcessEngine();//得到流程引擎processEngine;
ExecutionService executionService=processEngine.getExecutionService();//通过流程引擎得到流程执行服务;
ProcessInstance processInstance=executionService.startProcessInstanceByKey("test");
System.out.println("流程实例ID==="+processInstance.getId());
}
/**
* 获取对应人员的任务
*/
public void getTask(){
ProcessEngine processEngine=Configuration.getProcessEngine();//得到流程引擎processEngine;
TaskService taskService=processEngine.getTaskService();//通过流程引擎得到任务服务接口
// List<Task> tasks=taskService.findPersonalTasks("张三");//得到张三用户拥有的任务
List<Task> tasks=taskService.findPersonalTasks("李四");//得到李四用户拥有的任务
System.out.println("任务数量=="+tasks.size());
System.out.println("任务名称=="+tasks.get(0).getActivityName());
System.out.println("任务人员=="+tasks.get(0).getAssignee()+";任务ID=="+tasks.get(0).getId());
}
/**
* 查看流程实例当前所在节点。如查看请假流程到哪一步了。
*/
public void getCurrectActivity(){
ProcessEngine processEngine=Configuration.getProcessEngine();
ExecutionService executionService=processEngine.getExecutionService();
String activityName=executionService.createProcessInstanceQuery().processInstanceId("test.10001").uniqueResult().findActiveActivityNames().toString();
System.out.println("当前任务所在节点==="+activityName);
}
/**
* 完成任务:这一任务完成后,进入到下一任务。如果下一任务为end节点。那么这个流程实例就结束了。
*/
public void completeTask(){
ProcessEngine processEngine=Configuration.getProcessEngine();
TaskService taskService=processEngine.getTaskService();
// taskService.completeTask("10002");//完成任务id 10002,在JBPM4_TASK表的DBID字段;这个任务完成后执行到下一个任务节点
taskService.completeTask("20001");//完成任务id 20001,在JBPM4_TASK表的DBID字段;
}
}
解决:hibernate方言有问题
org.hibernate.dialect.MySQLDialect
把hibernate方言 的配置改成以下
org.hibernate.dialect.MySQLInnoDBDialect
解释:
1,mysql默认存储引擎为InnoDB,需创建新表(表名不存在),数据库方言只能选择MySQLDialect;
2,mysql默认存储引擎为InnoDB,需更改表结构(表名存在),数据库方言三者皆可选(建议选择MySQLInnoDBDialect);