JBPM4.4整合hibernate4所遇到的所有问题

 1.       问题1

a)       报错

                       i.             java.lang.NoClassDefFoundError:org/hibernate/impl/SessionImpl

b)       原因

                       i.             JBPM4默认使用的Hibernate3Hibernate4SessionImpl不再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中使用的Hibernate3Hibernate.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 >

8.问题8
  1. org.apache.jasper.JasperException: org.jbpm.api.JbpmException:   
  2.   error: parsing exception: expression factory class not found : javax.el.ELException: expression factory class not found
解决: 删除juel-api.jar包即可,因为它和tomcat的lib目录下el-api.jar冲突 。即juel仅保留juel-impl.jar,juel-engine.jar即可。

参考自博客http://lijiejava.iteye.com/blog/1934927,http://blog.51cto.com/fuyanchao/1614500
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值