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

Java Hibernate 空指針異常排查:sessionFactory 未注入導致 getCurrentSession() 為 null

     編輯:程式設計綜合問答

異常堆疊指向

Query query = sessionFactory.getCurrentSession().createQuery(hql);
// NPE 發生在 sessionFactory.getCurrentSession() 或 createQuery()

常見根因

  1. sessionFactory 未正確注入:Spring 配置缺失 `` 或 `@Autowired` 失效。
  2. 事務管理缺失:無 `@Transactional` 或事務管理器未配置,導致 `getCurrentSession()` 返回 null。
  3. 數據源/會話工廠初始化失敗:數據庫連接配置錯誤,啟動時未拋出異常但 bean 為 null。

分步排查代碼(加入防禦性判空)

public List getResult(String hql, Object[] parameters) {
    // 1. 判空 sessionFactory
    if (sessionFactory == null) {
        throw new IllegalStateException("sessionFactory 未注入,請檢查 Spring 配置");
    }

    // 2. 獲取 Session 並判空
    Session session = sessionFactory.getCurrentSession();
    if (session == null) {
        throw new IllegalStateException("getCurrentSession() 返回 null,通常因無活動事務。請在服務層方法加 @Transactional");
    }

    // 3. 創建 Query 並判空
    Query query = session.createQuery(hql);
    if (query == null) {
        throw new IllegalStateException("createQuery 返回 null,HQL 語法可能有誤: " + hql);
    }

    // 4. 設置參數
    if (parameters != null && parameters.length > 0) {
        for (int i = 0; i < parameters.length; i++) {
            query.setParameter(i, parameters[i]);
        }
    }
    return query.list();
}

Spring 配置檢查清單

  • 確認 `sessionFactory` bean 定義正確,`dataSource`、`hibernateProperties` 完整。
  • 服務層類/方法標註 `@Transactional`(需開啟 ``)。
  • 若用 `HibernateTemplate`/`HibernateDaoSupport`,確保正確注入 `sessionFactory`。
  • 檢查日誌啟動階段是否有 `sessionFactory` 創建失敗的 WARN/ERROR。

快速驗證技巧

// 在調用處臨時加入
System.out.println("sessionFactory = " + sessionFactory);
System.out.println("currentSession = " + sessionFactory.getCurrentSession());

多數「莫名其妙」的 NPE 實為**依賴注入未生效**或**事務邊界缺失**,加上判空日誌即可定位。

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