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

Hibernate Session.get() 查詢 String 主鍵回傳 null 排查

     編輯:程式設計疑難解答

問題現象

使用 session.get(String.class, "1-1001") 查詢,明確資料庫有資料,但回傳 null。

常見原因與排查步驟

1. 主鍵值不匹配 (最常見)

  • 資料庫實際值:"1-1001" vs 查詢值:"1-1001 " (含空白)
  • 大小寫差異:資料庫 "A-1001" vs 查詢 "a-1001" (視資料庫 Collation)
  • 型別轉換:資料庫 CHAR(10) 固定長度,實際儲存 "1-1001 " (右填空格)

驗證 SQL

SELECT * FROM student WHERE id = '1-1001'; -- 直接在資料庫執行確認

2. 映射關係錯誤

  • @Id 註解缺失或標註錯誤欄位
  • @Table(name="student") 表名不符 (大小寫、schema)
  • @Column(name="id") 欄位名不符
  • 複合主鍵未正確實作 @EmbeddedId / @IdClass

實體類別檢查清單

@Entity
@Table(name = "student") // 確認表名
public class Student {
    @Id
    @Column(name = "id", length = 20) // 確認欄位名、長度
    private String id;
    
    // getter/setter...
}

3. Session/Transaction 狀態問題

  • Session 已關閉:session.get() 需在開啟的 Session 中執行
  • 事務未提交:若在新事務中查詢未提交的資料,視隔離等級可能讀不到
  • 二級快取干擾:嘗試 session.clear() 或關閉二級快取測試

4. 資料庫實際無資料

  • 資料在其他 Schema/資料庫
  • 資料被軟刪除 (deleted=1)、過濾條件攔截
  • 視圖而非實體表,權限不足

除錯技巧

開啟 Hibernate SQL 日誌

# logback.xml / log4j2.xml
<logger name="org.hibernate.SQL" level="DEBUG"/>
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/> 

觀察實際執行 SQL 與參數值。

使用 Native SQL 驗證

String sql = "SELECT * FROM student WHERE id = ?";
Student student = session.createNativeQuery(sql, Student.class)
    .setParameter(1, "1-1001")
    .uniqueResult();

檢查快取

session.clear(); // 清除一級快取
session.getSessionFactory().getCache().evictAllRegions(); // 清除二級快取 (需權限)

快速排查流程圖

session.get() 回傳 null
    ↓
在資料庫直接執行 SELECT 確認資料存在?
    ├── 否 → 資料真無、表名錯、權限問題
    └── 是 → 複製資料庫實際主鍵值 (含隱藏字元) 到程式查詢
              ↓
         仍為 null?
              ├── 是 → 檢查 @Entity/@Id/@Table/@Column 映射
              │          ↓
              │      映射正確?
              │          ├── 否 → 修正映射
              │          └── 是 → 檢查 Session 狀態、事務、快取
              └── 否 → 主鍵值格式問題 (空白、大小寫、編碼)
                        → 程式端 trim()/標準化後再查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved