Hibernate操作Oracle CLOB字段设null偶存为空CLOB问题求解
Hibernate向Oracle CLOB字段写入null偶发存储为空CLOB问题处理
问题现象
- 操作Oracle的CLOB字段时,调用Hibernate接口写入null值,偶发存储为空CLOB而非NULL,出现概率约1/3到1/4
- 开发环境多种测试组合均无法复现,生产环境稳定出现
- 尝试通过触发器将空CLOB替换为NULL,反而触发异常,字段存储其他字段的随机数据
相关配置信息
表结构变更SQL
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 { // 其他字段省略 @Column(name = "IN_PAR_A") private String inParA; }
问题更新逻辑
Step entity = session.get(Step.class, "some ID"); entity.setInParA(null); // 其他字段处理逻辑 session.update(entity);
问题根源
Oracle CLOB属于大对象类型,Hibernate需要通过@Lob注解显式识别字段的大对象属性。未加注解时,Hibernate会动态推断字段映射类型,不同运行上下文下推断结果不稳定:部分场景按普通字符串类型处理,null值可以正常写入数据库;部分场景按未初始化大对象逻辑处理,将null值转换为空CLOB传入数据库,最终导致概率性问题。开发环境运行场景单一,所以无法复现该问题。
解决方案
在所有CLOB对应的实体类字段上添加@Lob注解即可彻底解决该问题,修正后的字段配置如下:
@Entity @Table(name = "STEP") @Data public class Step { // 其他字段省略 @Lob @Column(name = "IN_PAR_A") private String inParA; }
注:此前部分CLOB字段未加
@Lob注解也能正常运行属于偶发兼容情况,大对象字段必须显式添加@Lob注解才能保证Hibernate类型映射逻辑稳定,避免出现null值识别异常。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

