Java Hibernate/JPA:Embeddeble已初始化,尽管所有属性都为null或空

Java Hibernate/JPA:Embeddeble已初始化,尽管所有属性都为null或空,java,hibernate,jpa,Java,Hibernate,Jpa,我使用的是Hibernate,具有以下JPA模型: @实体 公共类MyEntity{ @嵌入 嵌入MyEmbeddable; } @可嵌入 公共类MyEmbeddable{ @纵队 私有字符串名称; @元素集合 @枚举(EnumType.STRING) @尺寸(最小值=1) 专用集使用; @NotNull 私有LocalDate LocalDate; } MyEntity可以包含MyEmbeddable,但整个embeddable应该是可选的。因此,当MyEmbeddable的所有属性都为空或

我使用的是Hibernate,具有以下JPA模型:

@实体
公共类MyEntity{
@嵌入
嵌入MyEmbeddable;
}
@可嵌入
公共类MyEmbeddable{
@纵队
私有字符串名称;
@元素集合
@枚举(EnumType.STRING)
@尺寸(最小值=1)
专用集使用;
@NotNull
私有LocalDate LocalDate;
}
MyEntity可以包含MyEmbeddable,但整个embeddable应该是可选的。因此,当
MyEmbeddable
的所有属性都为空或null时,我更希望
MyEntity.embedded
null

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

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

我怀疑ElementCollection导致了这种初始化行为——因为根据JPA规范,ElementCollections总是初始化为
空的
(非null)


有什么想法/提示可以告诉Hibernate不要初始化嵌入的
列吗?

您确定所有嵌入的列值都为空吗
localDate
是用
NotNull
注释的,所以我认为这就是阻止嵌入属性为null的问题。此外,电视机上的
@Size(min=1)
看起来也可能是个问题

请注意,Hibernate提供了一个用于控制该行为的选项():

历史上,Hibernate总是将@Embeddeble的所有空列值视为@Embeddeble本身应该为空。5.1允许应用程序规定Hibernate应改为使用空的@Embeddeble实例。这是通过选择加入设置实现的:
hibernate.create\u empty\u composites.enabled

有关详细信息,请参阅


您可以定义setter并在其中添加逻辑,检查对象是否为null以及类似于,
embedded.isValid()
,如果无效,则将embedded设置为null。