首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Hibernate 4 中使用 getHibernateTemplate() 報 NullPointerException 根因與修正

     編輯:程式設計綜合問答

錯誤堆疊追蹤

java.lang.NullPointerException
    at com.reitgn.dao.impl.AdvancedRegistrationDaoImpl.addAdvancedRegistration(AdvancedRegistrationDaoImpl.java:34)
    at com.reitgn.service.impl.AdvanceRegistrationServiceImpl.addAdvancedRegistration(AdvanceRegistrationServiceImpl.java:34)
    at com.reitgn.servlet.RegisterServlet.doPost(RegisterServlet.java:71)
    ...

核心問題:Hibernate 4 移除了 HibernateDaoSupport

錯誤日誌中關鍵資訊:

java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session

根本原因: Hibernate 4 起已棄用並移除 HibernateDaoSupport 與 HibernateTemplate。原專案碼繼承 HibernateDaoSupport 並呼叫 getHibernateTemplate().save(),導致執行期找不到對應方法。

Spring 配置檢視

提供的 applicationContext.xml 使用 LocalSessionFactoryBean 整合 Hibernate 4,事務管理配置正確,但 DAO 層寫法不相容。

解決方案:重寫 DAO 直接使用 Session API

錯誤寫法(Hibernate 3 風格)

public class AdvancedRegistrationDaoImpl extends HibernateDaoSupport {
    public void addAdvancedRegistration(AdvancedRegistration ar) {
        getHibernateTemplate().save(ar); // Hibernate 4 無此方法
    }
}

正確寫法(Hibernate 4+ 標準)

@Repository
public class AdvancedRegistrationDaoImpl {

    @Autowired
    private SessionFactory sessionFactory;

    public void addAdvancedRegistration(AdvancedRegistration ar) {
        Session session = sessionFactory.getCurrentSession(); // 獲取當前事務性 Session
        session.save(ar); // 直接使用原生 API
    }
}

關鍵差異對照表

特性Hibernate 3 (舊)Hibernate 4+ (新)
DAO 基類HibernateDaoSupport無需繼承,注入 SessionFactory
操作介面HibernateTemplateSession / Query / Criteria
Session 獲取getSession() / openSession()getCurrentSession() (推薦)
事務綁定Template 自動管理Spring @Transactional 管理

遷移檢查清單

  • 移除所有 extends HibernateDaoSupport
  • 注入 SessionFactory 替代 setSessionFactory()
  • 將 getHibernateTemplate().save() 改為 sessionFactory.getCurrentSession().save()
  • 查詢改用 session.createQuery() 或 session.createCriteria()
  • 確認 Spring 事務配置 <tx:annotation-driven/> 已啟用

完成上述修改後,NullPointerException 將消失,且程式碼更符合現代 Hibernate 最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved