【问题标题】:JPA stores null value in CLOB when setting an empty StringJPA 在设置空字符串时将空值存储在 CLOB 中
【发布时间】:2023-01-20 22:16:53
【问题描述】:

假设我有一个带有 Clob 列的实体条目,例如:

 @Entity
 public class Entry {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCE_GENERATOR")
  private Long id;

  @Lob
  @Column(name = "value")
  private String data;
...

在数据库中,我们有一个现有的条目行,其中 VALUE 是一个用 Oracle 的 EMPTY_CLOB() 函数初始化的 clob。 我需要将现有实体克隆到一个新实体,但是在查询并设置一个空字符串以从 Java 端模拟 EMPTY_CLOB() 之后,Oracle 显示一个(空)值而不是一个空的 Clob。 当使用 hibernate 作为 JPA 实现时。

使用 JPA 保存实体 2 后的预期结果:

SELECT * FROM ENTRY
ID VALUE
1          <------------ Returning an empty CLOB here
2 (null)

实际行为

SELECT * FROM ENTRY
ID VALUE
1          <------------ Returning an empty CLOB here
2          <------------ Returning an empty CLOB here

【问题讨论】:

  • 抱歉,帖子中有错误,所需的行为是:SELECT * FROM ENTRY ID VALUE 1 <------------ Returning an empty CLOB here 2 <---------- -- 在这里返回一个空的 CLOB

标签: oracle hibernate jpa clob


【解决方案1】:

这是因为 Java 中的空字符串不为 NULL,然后 ORM 为该列生成一个带有 "" 的 INSERT,并且未应用 DDL 中定义的 DEFAULT,最终 '' 在转换为 CLOB 之前转换为 NULL .

使用 Hibernate,您可以尝试将 @org.hibernate.annotations.Entity(dynamicInsert = true) 或 @DynamicInsert 放在实体上并且不要将列设置为空字符串:如果为 NULL,动态插入应在生成 INSERT 时跳过它语句,因此应应用 DLL 中定义的 DEFAULT。 (注意https://hibernate.atlassian.net/browse/HHH-7074) (你可能还需要 dyanmicUpdate = true)

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2013-10-21
    • 2013-12-28
    • 2018-08-11
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多