在使用 JPA 持久化長文本時,開發者常遇到一個詭異現象:String 型別映射 VARCHAR 正常,但加上 @Lob 映射 TEXT 卻出現亂碼。本文深入剖析根因,提供最佳實踐方案。
@Lob @Basic(fetch = FetchType.LAZY) private String content;
資料庫欄位自動生成為 TEXT 型別,讀寫中文內容卻變成亂碼。專案編碼統一為 UTF-8,一般 VARCHAR 欄位卻無異常。
@Lob 註解標示大型物件,根據 Getter 回傳型別自動判斷持久化為 CLOB(字串)或 BLOB(二進位)。然而,某些 JPA 實作(如 Hibernate)在處理 CLOB 時,會採用資料庫特定的 Locator 機制,導致字元集轉換異常,特別是在 PostgreSQL 環境下。
Clob 對應 java.sql.Clob、Character[]、char[]、StringBlob 對應 java.sql.Blob、Byte[]、byte[]、Serializable@Basic(fetch=FetchType.LAZY) 實現延遲載入@Basic(fetch = FetchType.LAZY) @Column(columnDefinition = "TEXT") private String content;
移除 @Lob,改用 @Column(columnDefinition="TEXT") 顯式宣告資料庫欄位型別。此方式繞過 JPA 的大型物件處理邏輯,直接以標準 VARCHAR/TEXT 字串流讀寫,完美解決編碼問題。
CLOB 轉為 TEXT。掌握 JPA 與資料庫型別映射的細微差異,能避開許多「莫名其妙」的編碼陷阱。