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配置文件获取;(注入报空指针):
1 2 3 4 5 | ApplicationContext factory = new ClassPathXmlApplicationContext( "applicationContext.xml" ); SessionFactory sessionFactory =(SessionFactory)factory.getBean( "sessionFactory" ); LobHelper lobHelper = sessionFactory.openSession().getLobHelper(); |
ii. 直接代码生成:
1 2 3 4 5 6 7 8 9 10 | 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,从而创建需要的实例;
1 2 3 | 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) 解决:
1 | < propkey = "hibernate.dialect" >org.hibernate.dialect.MySQL5Dialect</ prop > |
改为
1 | < propkey = "hibernate.dialect" >org.hibernate.dialect.MySQL5InnoDBDialect</ prop >
|
- org.apache.jasper.JasperException: org.jbpm.api.JbpmException:
- error: parsing exception: expression factory class not found : javax.el.ELException: expression factory class not found