【问题标题】:Hibernate/JPA: Embeddable is initialized altough all properties are null or emptyHibernate/JPA:Embeddable 已初始化,尽管所有属性都为 null 或为空
【发布时间】:2021-08-25 05:10:48
【问题描述】:

我正在使用 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 的所有属性为空或为空时,我更希望MyEntity.embeddednull

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

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

我怀疑 ElementCollection 会导致这种初始化行为 - 因为根据 JPA 规范 ElementCollection 始终被初始化 empty(非空)。

任何想法/提示如何告诉 Hibernate 根本不初始化 embedded

【问题讨论】:

  • 你定义 setter 并在那里添加你的逻辑,检查对象是否不为 null 之类的,embedded.isValid() 并设置嵌入为 null 如果它是无效的。

标签: java hibernate jpa


【解决方案1】:

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

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

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

详情请见HHH-7610

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2013-08-19
    • 2013-05-11
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多