JBPM 4.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配置文件獲取;(注入報空指針)

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章