JBPM 4.4和Hibernate4整合问题解决方法
1. 问题1:
a) 报错:
i. java.lang.NoClassDefFoundError:org/hibernate/impl/SessionImpl
b) 原因:
i. JBPM4默认使用的Hibernate3,Hibernate4中SessionImpl不再org/hibernate/impl包下;
ii. 当引用此包时,就会导致找不到此类而报错;
c) 错误所在类:
i. 在类org.jbpm.pvm.internal.wire.descriptor.HibernateSessionDescriptor中使用到了该类;
d) 解决:
i. 找到源文件,修改SessionImpl的引用包为:
ii. importorg.hibernate.internal.SessionImpl;
2. 问题2:
a) 报错:
i. java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session
b) 原因:
i. 解决问题1,而附带出来的问题;
ii. 因为Hibernate3中有方法sessionFactory.openSession(Connection),而在Hibernate4中 则没有了此方法,从而导致找不到;
c) 错误所在类:
i. 在类org.jbpm.pvm.internal.wire.descriptor.HibernateSessionDescriptor中使用到了该类;
d) 解决方法1:
i. 将该方法改为openSession(),不带参数;
ii. 缺点:
1. 每次都客气一个session,浪费;
e) 解决方法2:
i. 将该方法改为getCurrentSession(),同时*.cfg.xml中添加
<propertyname="current_session_context_class">thread</property>
ii. 缺点:
1. 可能导致问题Session was already closed
3. 问题3:
a) 报错:
i. Session was already closed;
b) 原因:
i. 使用了getCurrentSession()方法获取session;
ii. 可能当前还没有创建好session,而进行获取,从而导致的错误;
c) 错误所在类:
i. 在类org.jbpm.pvm.internal.wire.descriptor.HibernateSessionDescriptor中使用到了该类;
d) 解决方法1:
i. 换做openSession();
e) 解决方法2(还没有实践):
i. 使用getCurrentSession()获取session,
ii. 如果整合Spring的话,使用Spring注入不出错;
4. 问题4:
a) 错误:
i. java.lang.NoSuchMethodError:org.hibernate.Hibernate.createBlob([B)Ljava/sql/Blob; at org.jbpm.pvm.
b) 原因:
i. JBPM4.4中使用的Hibernate3的Hibernate.createBlob()方法创建Blob大数据对象;
ii. Hibernate4中取消了此方法,所以会导致找不到该方法;
c) 错误所在类:
i. org.jbpm.pvm.internal.lob.BlobStrategyBlob
d) 解决方法1:
i. 找到错误的类;
ii. 使用Hibernate4中提供的LobHelper#createBlob(bytes)方法生成Blob对象;
iii. 该类为SessionImpl类的内部类,需要通过SessionFactory对象获取到该类,在通过session#getLobHelper()方法获取;
e) SessionFactory对象的获取:
i. 通过直接读取Spring配置文件获取;(注入报空指针):
ApplicationContextfactory = new ClassPathXmlApplicationContext("applicationContext.xml"); SessionFactory sessionFactory =(SessionFactory)factory.getBean("sessionFactory"); LobHelperlobHelper = sessionFactory.openSession().getLobHelper();
ii. 直接代码生成:
public LobHelpergetLogHelper(){ Configuration configuration =new Configuration(); configuration.configure("jbpm.hibernate.cfg.xml"); org.hibernate.service.ServiceRegistryserviceRegisy = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) .build(); SessionFactory sessionFactory= configuration.buildSessionFactory(serviceRegisy); LobHelper lobHelper = sessionFactory.openSession().getLobHelper(); return lobHelper; }
5. 错误6:
a) 报错:
i. Error creating bean with name ‘processEngine‘ defined in ServletContext resource [/WEB-INF/config/applicationContext_jbpm.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.jbpm.api.ProcessEngine org.jbpm.pvm.internal.processengine.SpringHelper.createProcessEngine()] threw exception; nested exception is java.lang.NullPointerException
b) 原因:
i. 在使用Spring4的时候,JBPM默认生成SpringProcessEngine类的时候,引用的是import org.springframework.orm.hibernate3.LocalSessionFactoryBean;包下的类;
c) 解决:
i. 该为引用hibernate4的包;
6. 问题6:
a) 报错:
i. 获取SessionFactory的时候为空;
b) 原因:
i. 使用的是注入的SessionFactory,每次确实注入了,但不知为什么获取不到;
c) 解决:
i. 在org.jbpm.pvm.internal.lob.BlobStrategyBlob类中,直接读取Spring配置文件,获取SessionFactory,从而创建需要的实例;
ApplicationContextfactory = new ClassPathXmlApplicationContext("applicationContext.xml"); SessionFactory sessionFactory =(SessionFactory)factory.getBean("sessionFactory"); LobHelper lobHelper =sessionFactory.openSession().getLobHelper();
7. 问题7:
a) 报错:
i. org.springframework.dao.DataIntegrityViolationException:Could not execute JDBC batch update; SQL [delete
b) 原因:
i. JBPM4.4整合Spring后,所使用的数据库方言问题,
c) 解决:
<propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
改为
<propkey="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
参考了http://lijiejava.iteye.com/blog/1934927,如果整合的是Spring3可以参考下;
本文出自 “随风” 博客,请务必保留此出处http://fuyanchao.blog.51cto.com/3752384/1614500
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。