Apr
13
SSH+jbpm集成过程中DbPersistenceService - hibernate commit failed 的解决方法
在集成SSH+jbpm的过程中,遇到了错误,“ERROR org.jbpm.persistence.db.DbPersistenceService - hibernate commit failed”,在网上搜了很多资料没有找到解决方法,没有办法只能自己调试程序试着找原因了,最终发现了问题所在。特记录如下:
我在集成过程中,部署流程已经成功,但是在使用spring自动生成的jbpmTemplate bean来保存流程实例ProcessInstance时却报错,调试跟踪错误是出在了“jbpmContext.close()”这里。原因是这样的:
springmodules提供的“org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean”类来创建ProcessDefinition流程定义实例,并且注入到JbpmTemplate实例中,而在创建ProcessDefinition流程实例时只是从xml读取流程实例,并不是从数据库中找到流程定义的最后版本,所以导致创建的流程定义的id是0,也就是没有进行持久化,所以我们使用该流程定义创建了流程实例后,又要对该流程实例保存时,流程实例和流程定义有外键关系,导致提交失败。
错误出现在“jbpmContext.close()”,是因为在这句才结束事务,实际提交数据,也就出现了hibernate commit failed的错误。
解决方法:
如果哪里还没有明白,可以去参考下org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean的源代码,就明白为什么spring获取的流程定义对象不能创建能保存到数据库的流程实例了。
最后再说明下,spring自己创建的流程对象如果当次部署过的话是可以创建流程实例并保存到数据库的,这是因为部署流程后流程定义就有id了,也就是持久化过了,这关系到jbpm和SSH的集成的方法,这方面的资料网上可以找到一些,大家就参考下网上其他的资料吧。
我在集成过程中,部署流程已经成功,但是在使用spring自动生成的jbpmTemplate bean来保存流程实例ProcessInstance时却报错,调试跟踪错误是出在了“jbpmContext.close()”这里。原因是这样的:
springmodules提供的“org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean”类来创建ProcessDefinition流程定义实例,并且注入到JbpmTemplate实例中,而在创建ProcessDefinition流程实例时只是从xml读取流程实例,并不是从数据库中找到流程定义的最后版本,所以导致创建的流程定义的id是0,也就是没有进行持久化,所以我们使用该流程定义创建了流程实例后,又要对该流程实例保存时,流程实例和流程定义有外键关系,导致提交失败。
错误出现在“jbpmContext.close()”,是因为在这句才结束事务,实际提交数据,也就出现了hibernate commit failed的错误。
解决方法:
JbpmContext jbpmContext = jbpmTemplate.getJbpmConfiguration().createJbpmContext();
try{
GraphSession graphSession = jbpmContext.getGraphSession();
//获取流程实例,这样是从数据库中解析流程实例的最后版本
ProcessDefinition definition = graphSession.findLatestProcessDefinition("simple");
//这里注释掉的是原来使用的代码,这样的话用的是spring生成的流程定义对象,是从xml解析来的
// ProcessInstance pi = new ProcessInstance(jbpmTemplate.getProcessDefinition());
ProcessInstance pi = definition.createProcessInstance();
jbpmContext.save(pi);
}
finally{
jbpmContext.close();
}
try{
GraphSession graphSession = jbpmContext.getGraphSession();
//获取流程实例,这样是从数据库中解析流程实例的最后版本
ProcessDefinition definition = graphSession.findLatestProcessDefinition("simple");
//这里注释掉的是原来使用的代码,这样的话用的是spring生成的流程定义对象,是从xml解析来的
// ProcessInstance pi = new ProcessInstance(jbpmTemplate.getProcessDefinition());
ProcessInstance pi = definition.createProcessInstance();
jbpmContext.save(pi);
}
finally{
jbpmContext.close();
}
如果哪里还没有明白,可以去参考下org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean的源代码,就明白为什么spring获取的流程定义对象不能创建能保存到数据库的流程实例了。
最后再说明下,spring自己创建的流程对象如果当次部署过的话是可以创建流程实例并保存到数据库的,这是因为部署流程后流程定义就有id了,也就是持久化过了,这关系到jbpm和SSH的集成的方法,这方面的资料网上可以找到一些,大家就参考下网上其他的资料吧。
JBPM工作流常用API



