首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Hibernate 實戰:Date 類型與 Sequence 主鍵衝突排查

     編輯:Oracle 資料庫基礎

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;

二、Hibernate 映射配置

<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"/>

三、Java 實體與保存代碼

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 字段後恢復正常。
  • 環境:同專案其他實體同樣使用 Date + Sequence 均正常,僅此實體異常。
  • 根因假設:
    1. 映射文件中 type="timestamp" 與數據庫 DATE 類型不匹配,導致 Hibernate 生成的 SQL 參數綁定順序錯位,Sequence 值被錯誤綁定到日期參數,再回寫到 ID。
    2. 數據庫觸發器/默認值干擾。
    3. Hibernate 版本 Bug(早期版本已知類似問題)。
  • 建議排查步驟:
    1. 開啟 Hibernate SQL 日志(show_sql=true),對比生成的 INSERT 語句參數順序。
    2. 將映射改為 type="date" 或 type="java.sql.Timestamp",與 DB DATE 對齊。
    3. 檢查表上是否存在 BEFORE INSERT 觸發器覆寫 ID。
    4. 嘗試升級 Hibernate 版本或使用 @GeneratedValue(strategy=GenerationType.SEQUENCE) 註解式配置。

五、臨時規避方案

將 bill_date 由數據庫默認 SYSDATE 填充(移除 Java 端設置),或改用 TIMESTAMP 類型並同步映射,暫時繞過衝突。

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