org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session
在整合hibernate與spring時出現如下錯誤:
Exception in thread "main" java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:324)
at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:235)
at org.springframework.orm.hibernate3.HibernateTemplate.getSession(HibernateTemplate.java:457)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:393)
at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:343)
在UserDao層繼承HIbernateDaoSupport類 告訴我hibernate3出現錯誤,然後實在沒辦法,到網上去搜,
在網上找了好多相關網頁,都沒找到具體原因,總的來說就是spring4與hibernate3不相容,上網搜了結果說可以不用繼承hibernateDaoSupport類,可以直接引用sessionFactory,直接用sessionFactory獲取session物件。
public class UserDaoImpl implements BaseDictDao{
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public List<BaseDict> findByTyeCode(String dict_type_code) {
Session session=sessionFactory.openSession();
return session.createQuery("from BaseDict where dict_type_code=:code").setParameter("code", dict_type_code).list();
}
applicationContext.xml檔案裡面填寫
<bean name="userDao" class="com.top.dao.UserDaoImpl">
<property name="sessionFactory" value="sessionFactory">
</bean>
這個方法我也用了,但是不知道是自己之前搗鼓的原因還是本身的原因,結果沒出來。。。
大家可以試試,或許你們可以。
2.後來我發現這個辦法我行不通,我又想了另一個辦法,報錯裡面告訴我hibernate3版本與spring4不相容,但是我applicationContext.xml 裡面的dataSource都是hibernate5版本,為什麼他會報3版本,後來我想了想,有可能是我hibernateDaoSupport類導錯包了,
發現類裡面導的包是:
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
是3版本,想了想肯定是這出錯了,然後我把這個包給刪掉了,點選HibernateDaoSupport 按住ctrl+1,出現hibernate版本3,4,5三個版本,然後我重新選擇5版本,重新伺服器,在瀏覽器輸入網址,發現不報錯了。
一個小小的失誤,花了我一天半時間去搞它,真的是浪費青春啊 ,不說了繼續改別的程式碼了,希望這個可以幫助大家!