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

Hibernate 插入 MySQL CLOB 字段報 Invalid position in BLOB object set 異常排查

     編輯:程式設計疑難解答

異常堆疊核心信息

Caused by: javax.sql.rowset.serial.SerialException: Invalid position in BLOB object set
    at javax.sql.rowset.serial.SerialClob.getSubString(SerialClob.java:255)
    at com.mysql.jdbc.PreparedStatement.setClob(PreparedStatement.java:3529)
    at org.hibernate.type.ClobType.set(ClobType.java:73)
    at org.hibernate.type.ClobType.nullSafeSet(ClobType.java:141)

環境信息

  • Spring + Hibernate 3.x
  • MySQL 5.x + Connector/J 5.1.x
  • 實體類字段:@Lob private String detail; 對應表字段 LONGTEXT 或 BLOB

常見原因與解決

1. MySQL 驅動版本不匹配導致 Clob 處理邏輯異常

現象:Connector/J 5.1.38+ 修改了 setClob 實現,與 Hibernate 3.x 的 ClobType 不兼容。
解決:降級驅動至 5.1.37 或升級 Hibernate 至 4.x/5.x。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.37</version> <!-- 推薦版本 -->
</dependency>

2. 實體映射類型與數據庫字段類型不匹配

Java 類型Hibernate 映射MySQL 字段說明
String@Lob / @Type(type="text")LONGTEXT / TEXT推薦,存文本
String@LobBLOB / LONGBLOB驅動嘗試按二進制處理,易報錯
Clob@LobLONGTEXT需手動創建 Clob 對象,麻煩

建議:字段定義為 LONGTEXT,實體用 @Lob @Column(columnDefinition="LONGTEXT") private String detail;

3. 事務邊界問題導致 Clob 對象游標失效

若在事務提交前關閉 Session,或懶加載時 Session 已關閉,Clob 內部流對象失效。
檢查:確保 @Transactional 覆蓋完整業務方法,或使用 OpenSessionInViewFilter。

4. 連接池配置干擾

DBCP/HikariCP 若配置了 accessToUnderlyingConnectionAllowed=true 可能導致包裹連接行為異常。嘗試關閉該選項或換用 HikariCP 默認配置。

排查步驟清單

  1. 確認 MySQL 字段類型為 LONGTEXT 而非 BLOB
  2. 檢查 mysql-connector-java 版本,鎖定 5.1.37
  3. 實體字段加上 @Column(columnDefinition="LONGTEXT")
  4. 驗證事務範圍覆蓋完整持久化操作
  5. 啟用 SQL 日誌 hibernate.show_sql=true 觀察實際執行語句

臨時繞過方案

若急需上線,可將字段改為 VARCHAR(65535) 或拆分多行存儲,但會有長度限制。

原帖作者最終回復「已解決,但不知原因」,建議按上述清單逐項驗證,定位根因並文檔化,避免後續復發。

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