Oracle CLOB 字段中的空 CLOB 而不是 NULL

Empty CLOB instead of NULL in Oracle CLOB field

使用 Hibernate 将空字符串写入 Oracle CLOB 字段有时会导致字段中出现空 CLOB 而不是 NULL。

Table 混合了 varchar2、数字和 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,并发现有时它从驱动程序中获取“”,我再次无法在开发中重现。此外,我能够启动大约两打完全相同的序列,这会导致新的 STEP 记录,其中一些存储空 CLOB 而大多数存储空值。 我尝试添加触发器以将空值替换为 NULL,但它破坏了记录 - 以某种方式而不是 NULL 或清空该字段存储了来自其他字段的一些随机数据。

要求 STEP.IN_PAR_A 包含 NULL 而不是空 CLOB,但我不知道要修复什么。

如有任何建议,我们将不胜感激。

UPD 正如建议的那样,只需添加 @Lob 注释即可。没有此注释的 5 个表中的旧 14 列工作正常(但现在添加了注释)

一种解决方案是改用 @Lob 注释。尽管 Hibernate 支持字符串来处理 clob 列,但我发现使用此注释总是更好,因此可以避免任何潜在问题。

在这里你可以找到一篇关于如何使用它的好文章

Hibernate LOB

我个人认为 Hibernate 在使用 string 处理 CLOB 时仍然存在一些问题。我发现自己处于其他奇怪的场景中,使用 @LOB 总能解决它们。