Hibernate/JPA:虽然所有属性都为null或空,但Embeddable已初始化



我正在使用Hibernate,并具有以下JPA模型:

@Entity
public class MyEntity {
@Embedded
MyEmbeddable embedded;
}
@Embeddable
public class MyEmbeddable {
@Column    
private String name;
@ElementCollection
@Enumerated(EnumType.STRING)
@Size(min = 1)
private Set<MyEnum> usage;
@NotNull
private LocalDate localDate;
}

MyEntity可以包含MyEmbeddable,但整个embeddable应该是可选的。所以当MyEmbeddable的所有属性都为空或null时,我更希望MyEntity.embeddednull

然而,当我从DB中读取这样一个实体时,Hibernate会将embedded初始化为non-null——当实体再次刷新到数据库时,这会导致约束错误。

作为一种变通方法,在刷新/持久化之前,我必须向null(embedded属性(写入一些代码——这对我来说似乎是一个非常糟糕的主意

我怀疑ElementCollection导致了这种初始化行为,因为根据JPA规范,ElementCollection总是初始化empty(不是null(。

有什么想法/提示可以告诉Hibernate根本不初始化embedded吗?

是否确定所有嵌入的列值都为null?localDate是用NotNull注释的,所以我认为这是防止嵌入属性为null的问题。此外,片场的@Size(min = 1)看起来也可能是个问题。

请注意,Hibernate提供了一个用于控制该行为的选项(https://in.relation.to/2016/02/10/hibernate-orm-510-final-release/):

从历史上看,Hibernate总是将@Embeddable的所有null列值视为@Embeddable。5.1允许应用程序指定Hibernate应该使用一个空的@Embeddable实例。这是通过选择加入设置实现的:hibernate.create_empty_composites.enabled

详见HHH-7610。

最新更新