假设我有一个包含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
1条答案
按热度按时间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)