使用Hibernate 将空字符串写入Oracle字段,有时会导致字段中的空CLOB而不是null。
使用varchar2、number和CLOB字段混合的表步骤一次使用一个新的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;
}当存储非空值时,所有操作都按预期工作。但是,当使用非空值存储的新记录(后来更新为NULL (使用事务))时,有时会在字段中存储一个空的CLOB,而不是null。
Step entity = session.get(Step.class, "some ID");
entity.setInParA(null);
//other fields
session.update(entity);主要问题是不稳定性-非空值只写在1/3.1/4的记录中。我无法通过step.inParA字段中任何NULL和"“组合的直接hibernate存储步骤实体在系统的dev实例中再现。但这种情况发生在产品系统上。我可以通过添加一个触发器来调试一个小小的Oracle,有时它会“从”驱动程序那里得到,而我也无法在dev中再现它。此外,我还能够启动大约20次完全相同的序列,这将导致新的步骤记录,其中一些记录存储为空CLOB,而大多数存储为null。我尝试添加一个触发器来将空替换为空,但它破坏了记录--而不是空或空字段,而是存储了其他字段中的一些随机数据。
要求STEP.IN_PAR_A包含NULL而不是空CLOB,但我不知道该修复什么。
如有任何建议,将不胜感激。
正如建议的那样,仅仅添加@Lob注释是有帮助的。没有此注释的5个表中的14列可以正常工作(但现在添加了注释)
发布于 2021-10-23 09:56:57
一种解决方案是使用@Lob注释。尽管Hibernate支持字符串来处理clob列,但我发现总是更好地使用这个注释,从而避免任何潜在的问题。
在这里你可以找到一篇关于如何使用它的好文章。
我个人认为,Hibernate在使用CLOB处理string时仍然存在一些问题。我发现自己处于其他奇怪的场景中,使用@LOB总是能解决这些问题。
https://stackoverflow.com/questions/69679824
复制相似问题