设置空字符串时,JPA在CLOB中存储空值

lhcgjxsq  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(188)

假设我有一个包含Clob列的实体Entry,如下所示:

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

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

在数据库中,我们有一个现有的Entry行,其中VALUE是用Oracle的EMPTY_CLOB()函数初始化的Clob。我需要将现有的克隆到一个新实体,但在从Java端查询并设置一个空字符串以模拟EMPTY_CLOB()后,Oracle显示了一个(null)值,而不是空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
bf1o4zei

bf1o4zei1#

这是因为Java中的空字符串不是NULL,然后ORM为该列生成一个带有“”的INSERT,并且DDL中定义的DEFAULT没有应用,最终在强制转换为CLOB之前,""被转换为NULL。
使用Hibernate时,你可以尝试在实体上放置@org. hib.annotations.Entity(dynamicInsert = true)或@DynamicInsert,并且不要将列设置为空字符串:如果为NULL,动态插入在生成INSERT语句时应该跳过它,因此应该应用DLL中定义的DEFAULT。(注意https://hibernate.atlassian.net/browse/HHH-7074)(您可能还需要dyanmicUpdate = true)

相关问题