在Oracle CLOB字段中为空CLOB而不是NULL



使用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的记录。我无法通过直接hibernate存储具有NULL和"任何组合的步骤实体在系统的开发实例中复制;在步骤中。inParA字段。但是它发生在产品系统上。我能够通过添加一个触发器来调试一个小Oracle,并发现有时它会";"另外,我能够启动大约24次完全相同的序列,这导致新的STEP记录,其中一些存储空CLOB,而大多数存储空。我已经尝试添加一个触发器来替换空为NULL,但它破坏了记录-不知何故,而不是NULL或空字段存储一些随机数据从其他字段。

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

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

UPD正如建议的那样,只是添加@Lob注释有所帮助。没有这个注释的5个表中的14列可以正常工作(但是现在添加了注释)

一个解决方案是使用@Lob注释代替。虽然Hibernate支持字符串来处理clob列,但我发现使用这个注释总是更好,从而避免任何潜在的问题。

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

Hibernate LOB

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

最新更新