首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle CLOB字段中的空CLOB而不是NULL

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

Stack Overflow用户
提问于 2021-10-22 15:54:12
回答 1查看 614关注 0票数 1

使用Hibernate 将空字符串写入Oracle字段,有时会导致字段中的空CLOB而不是null。

使用varchar2、number和CLOB字段混合的表步骤一次使用一个新的CLOB字段进行扩展。

代码语言:javascript
复制
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>);

并将相应的字段添加到实体中。

代码语言:javascript
复制
@Entity
@Table(name = "STEP")
@Data
public class Step {
  //some other fields
  @Column(name = "IN_PAR_A")
  private String inParA;
}

当存储非空值时,所有操作都按预期工作。但是,当使用非空值存储的新记录(后来更新为NULL (使用事务))时,有时会在字段中存储一个空的CLOB,而不是null。

代码语言:javascript
复制
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列可以正常工作(但现在添加了注释)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-23 09:56:57

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

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

冬眠LOB

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69679824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档