Hibernate 與 Oracle 整合時,java.util.Date 映射 DATE/TIMESTAMP 以及 Sequence 主鍵生成是常見痛點。本文通過完整 DDL、映射配置、Java 實體、保存代碼,複現並解決「Date 字段導致 Sequence 值溢出」的離奇故障。
CREATE TABLE tb_bill (
bill_id INTEGER NOT NULL,
shop_id INTEGER,
bill_content VARCHAR2(200),
bill_handler VARCHAR2(20),
bill_date DATE,
CONSTRAINT pk_tb_bill PRIMARY KEY (bill_id)
);
CREATE SEQUENCE seq_tb_bill;
<id name="id" unsaved-value="0">
<column name="bill_id"/>
<generator class="sequence">
<param name="sequence">SEQ_TB_BILL</param>
</generator>
</id>
<property name="shopId" column="shop_id"/>
<property name="billContent" column="bill_content"/>
<property name="billHandler" column="bill_handler"/>
<property name="billDate" column="billdate" type="timestamp"/>
public class Bill {
private int id;
private int shopId;
private String billContent;
private String billHandler;
private Date billDate; // java.util.Date
// getter/setter 省略
}
// 保存邏輯
Bill model = new Bill();
model.setBillContent("neirong");
model.setBillHandler("handler");
model.setShopId(2);
billDAO.save(model);
System.out.println(model.getId()); // 期望獲取生成的序列值
bill_id 生成超大數值(超出 int 範圍),但移除 billDate 字段後恢復正常。type="timestamp" 與數據庫 DATE 類型不匹配,導致 Hibernate 生成的 SQL 參數綁定順序錯位,Sequence 值被錯誤綁定到日期參數,再回寫到 ID。show_sql=true),對比生成的 INSERT 語句參數順序。type="date" 或 type="java.sql.Timestamp",與 DB DATE 對齊。BEFORE INSERT 觸發器覆寫 ID。@GeneratedValue(strategy=GenerationType.SEQUENCE) 註解式配置。將 bill_date 由數據庫默認 SYSDATE 填充(移除 Java 端設置),或改用 TIMESTAMP 類型並同步映射,暫時繞過衝突。