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可以參考下;