使用jbpm的所有的jar覆盖原来的hibernate的jar包,注意不同的hibernate版本的头信息是不一样的,将jbpm的关于hibernate的主配置文件和原来的配置文件合并,这样jbpm.cfg.xml就找不到hibernate的配置了,但是我们和spring整合,由spring管理hibernate和事务,配置下面的即可。
1,删除配置:<importresource="jbpm.tx.hibernate.cfg.xml" />
1, 增加配置:<importresource="jbpm.tx.spring.cfg.xml" />
<!-- 配置ProcessEngine(整合jBPM4) -->
<!--jbpmCfg是相对于classpath的相对路径,默认值为jbpm.cfg.xml -->
<beanid="springHelper"
class="org.jbpm.pvm.internal.processengine.SpringHelper">
<property name="jbpmCfg"value="jbpm.cfg.xml"></property>
</bean>
<beanid="processEngine" factory-bean="springHelper"
factory-method="createProcessEngine" />
如果spring容器中只有一个事务管理器,那么springhelper就使用这个事务管理器(肯定是按类型查找),否则就必须明确指定。
@Test // 测试ProcessEngine
publicvoid testProcessEngine() {
ProcessEngine processEngine =(ProcessEngine)ac.getBean("processEngine");
Assert.assertNotNull(processEngine);
}
如果做了JBPM4.4与Spring整合(使用了jbpm.tx.spring.cfg.xml),则在程序中就一定要使用Spring注入ProcessEngine,千万不能使用Configuration.getProcessEngine()生成ProcessEngine,因为这时内部的代码有以下逻辑:如果整合了Spring但没有ApplicationContext,就默认读取applicationContext.xml创建ApplicationContext实例并从中获取名为”ProcessEngine”的对象。而这时如果把pe =Configuration.getProcessEngine()写成某Spring中管理的bean的初始化代码,就会有无限循环,不停的创建ApplicationContext了!
1, 修改 jbpm.tx.hibernate.cfg.xml
a) 不让jBPM自行管理事务:去掉<standard-transaction-interceptor/>
b) 让Jbpm使用SessionFactory.getCurrentSession():修改为 <hibernate-sessioncurrent="true" />
2, 配置可以使用SessionFactory.getCurrentSession(),在jbpm.hibernate.cfg.xml 中配置:<propertyname="hibernate.current_session_context_class">thread</property>
3, 要使用同一个SessionFactory,且都要使用 SessionFactory.getCurrentSession() 获取 Session:
a) 同一个SessionFactory:SessionFactory sf = processEngine.get(SessionFactory.class)
b) 在 BaseDaoImpl 中增加:
i. getSession() { returnHibernateUtils.getSessionFactory().getCurrentSession(); }
ii. getProcessEngine(){ returnorg.jbpm.api.Configuration.getProcessEngine(); }
4, 统一的打开与提交或回滚事务:使用 OpenSessionInViewFilter 控制事务。
atorg.apache.jsp.WEB_002dINF.jsp.UserAction.loginUI_jsp._jspInit(loginUI_jsp.java:39)
atorg.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
atorg.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
atorg.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
atorg.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
atorg.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
...40 more
说明:原因是Jbpm的juel.jar, juel-engine.jar,juel-impl.jar包和Tomcat6.0中的el-api.jar包冲突了。
有三个解决办法:
1,方法一:在MyEclipse的Preferences -> MyEclipse ->Application Servers -> Tomcat -> .. -> Paths 中配置 Append to classpath,选中 juel.jar, juel-engine.jar,juel-impl.jar 这三个jar包就可以了。
2,方法二:将 juel.jar, juel-engine.jar,juel-impl.jar 这三个包复制到tomcat6下 lib/ 中,并删除原来的el-api.jar,
切记还要把工程中 WEB-INF\lib 下的 juel.jar, juel-engine.jar,juel-impl.jar 删除,不然还是要冲突。
3,方法三:换成tomcat5.5,就没有问题了。
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:Cannot delete or update a parent row: a foreign key constraint fails(`itcastoa_20100909/jbpm4_execution`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY(`INSTANCE_`) REFERENCES `jbpm4_execution` (`DBID_`))
解决办法:把方言设为MySQL5InnoDBDialect,不能是 MySQLDialect。