使用 Hibernate 將空字串寫入 Oracle CLOB 欄位有時會導致欄位中出現空 CLOB 而不是 NULL。
包含 varchar2、number 和 CLOB 欄位的表 STEP 曾經使用新的 CLOB 欄位進行擴展。
ALTER TABLE STEP
ADD (IN_PAR_A CLOB)
LOB(IN_PAR_A) STORE AS CLOB_STEP_IN_PAR_A
(NOCACHE FILESYSTEM_LIKE_LOGGING COMPRESS HIGH TABLESPACE <tblspace for LOBs>);
并在物體中添加了相應的欄位
@Entity
@Table(name = "STEP")
@Data
public class Step {
//some other fields
@Column(name = "IN_PAR_A")
private String inParA;
}
當存盤非空值時,一切都按預期作業。但是,當新記錄存盤為非空值,后來更新為空(使用事務)時,有時會在欄位中存盤一個空的 CLOB 而不是 NULL。
Step entity = session.get(Step.class, "some ID");
entity.setInParA(null);
//other fields
session.update(entity);
主要問題是不穩定 - 非空值僅寫入 1/3..1/4 條記錄。我無法通過直接休眠存盤 Step 物體在 step.inParA 欄位中使用 NULL 和 "" 的任意組合在系統的開發實體中重現。但它發生在產品系統上。我能夠通過添加觸發器來除錯一個小 Oracle,發現有時它從驅動程式中得到“”,我再次無法在開發中重現。此外,我能夠啟動大約 20 次完全相同的序列,這會導致新的 STEP 記錄,其中一些存盤空的 CLOB,而大多數存盤為空。我曾嘗試添加一個觸發器來將空替換為 NULL,但它破壞了記錄 - 不知何故而不是 NULL 或清空該欄位存盤了來自其他欄位的一些隨機資料。
要求 STEP.IN_PAR_A 包含 NULL 而不是空的 CLOB,但我不知道要修復什么。
任何意見,將不勝感激。
UPD 正如建議的那樣,添加 @Lob 注釋有幫助。沒有此注釋的 5 個表中的舊 14 列作業正常(但現在添加了注釋)
uj5u.com熱心網友回復:
一種解決方案是改用@Lob注釋。盡管 Hibernate 支持字串處理clob列,但我發現使用此注釋總是更好,因此可以避免任何潛在問題。
在這里你可以找到一篇關于如何使用它的好文章
休眠 LOB
我個人認為 Hibernate 在處理CLOB使用string. 我發現自己處于其他奇怪的場景中,并且使用@LOB總是可以解決它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/337005.html
