Hibernate/JPA:尽管所有属性均为 null 或为空,但 Embeddable 已初始化

eid*_*ihi 5 java hibernate jpa

我正在使用 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;

}
Run Code Online (Sandbox Code Playgroud)

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

然而,当我从数据库读取这样的实体时,Hibernate 初始化embeddednon-null- ,当实体再次刷新到数据库时,这会导致约束错误。

作为一种解决方法,我必须在刷新/保留之前向该属性编写一些代码null-embedded这对我来说似乎是一个非常糟糕的主意。

我怀疑 ElementCollection 导致了这种初始化行为 - 因为根据 JPA 规范 ElementCollections 始终被初始化empty(不为 null)。

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

man*_*uti 0

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

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

从历史上看,Hibernate 始终会处理 @Embeddable 的所有空列值,这意味着 @Embeddable 本身应该为 null。5.1 允许应用程序指示 Hibernate 应使用空的 @Embeddable 实例。这是通过选择加入设置来实现的:hibernate.create_empty_composites.enabled

有关详细信息,请参阅HHH-7610