在 SSH 電商專案開發中,遭遇詭異現象:session.save() / update() 執行無異常、無 SQL 輸出、數據庫無變更。經排查發現根因在於 POJO 日期字段類型與數據庫列類型映射不匹配,本文記錄完整排查思路與解決方案。
Product 實體持久化失效show_sql=true 無對應 INSERT/UPDATE 輸出auto_increment 正常數據庫表結構:
date timestamp default CURRENT_TIMESTAMP
POJO 映射:
@Column(name = "date", nullable = false, length = 19)
private Timestamp date;
Hibernate 4 對 java.sql.Timestamp 映射 TIMESTAMP 列存在已知兼容性問題:類型解析器可能誤判為不可寫入屬性,導致實體處於「只讀」狀態,持久化操作被靜默忽略。
將 POJO 字段類型改為 java.util.Date:
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "date", nullable = false)
private Date date;
Hibernate 會自動根據 @Temporal 註解將 Date 轉換為數據庫 TIMESTAMP,避免類型衝突。
java.util.Date + @Temporal,避免直接用 java.sql.* 類型log4j.logger.org.hibernate=DEBUG 可見實體狀態變遷java.util.Date + @Temporal@Column 的 length 屬性對日期類型無效,需移除Serializable,定義 serialVersionUID這個坑看似微小,卻能耗費數小時排查。記住:映射類型不匹配是 Hibernate 靜默失效的頭號殺手。