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)
@Lob private String detail; 對應表字段 LONGTEXT 或 BLOB現象: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>
| Java 類型 | Hibernate 映射 | MySQL 字段 | 說明 |
|---|---|---|---|
| String | @Lob / @Type(type="text") | LONGTEXT / TEXT | 推薦,存文本 |
| String | @Lob | BLOB / LONGBLOB | 驅動嘗試按二進制處理,易報錯 |
| Clob | @Lob | LONGTEXT | 需手動創建 Clob 對象,麻煩 |
建議:字段定義為 LONGTEXT,實體用 @Lob @Column(columnDefinition="LONGTEXT") private String detail;
若在事務提交前關閉 Session,或懶加載時 Session 已關閉,Clob 內部流對象失效。
檢查:確保 @Transactional 覆蓋完整業務方法,或使用 OpenSessionInViewFilter。
DBCP/HikariCP 若配置了 accessToUnderlyingConnectionAllowed=true 可能導致包裹連接行為異常。嘗試關閉該選項或換用 HikariCP 默認配置。
LONGTEXT 而非 BLOBmysql-connector-java 版本,鎖定 5.1.37@Column(columnDefinition="LONGTEXT")hibernate.show_sql=true 觀察實際執行語句若急需上線,可將字段改為 VARCHAR(65535) 或拆分多行存儲,但會有長度限制。
原帖作者最終回復「已解決,但不知原因」,建議按上述清單逐項驗證,定位根因並文檔化,避免後續復發。