jpa中的可空映射映射

Posted

技术标签:

【中文标题】jpa中的可空映射映射【英文标题】:Nullable Map mapping in jpa 【发布时间】:2014-11-06 13:33:01 【问题描述】:

我正在尝试使用 JPA2.1 和 Hibernate 4.3.7 将实体键与实体值映射映射到数据库。 这是我的代码:

@Entity
@Audited
class Form

    //id

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "form_content",
        joinColumns = @JoinColumn(name = "id_form", nullable = false),
        inverseJoinColumns = @JoinColumn(name = "id_field_content"/*non-working part start*/, unique = false, nullable = true/*non-working part stop*/),
        uniqueConstraints =  @UniqueConstraint(columnNames =  "id_field", "id_form" ) )
    @MapKeyJoinColumn(name = "id_field", nullable = false)
    private Map<FormEntryDefinition, FormEntryValue> content;

    //getters, setters, equals, etc.

Hibernate 生成表

form_content(
    id_form bigint primary key not null,
    id_field_content bigint <!-- problem start -->not null unique <!--problem stop -->,
    id_field bigint primary key not null)

在所有 3 个字段中都有正确的外键。

谁能告诉我,为什么 hibernate 会生成唯一而不是 null 约束,所以我不能持久化具有可为空值的映射?

这个问题有解决办法吗?

【问题讨论】:

【参考方案1】:

唯一约束是由于使用了@OneToMany 关联。如果将其更改为 @ManyToMany,则不再需要唯一约束。

连接表 FK 列仅对不可为空的列有意义。连接表中的一行是两个表之间的链接,如果缺少一个 FK,则关联无论如何都会中断,这相当于一开始就没有链接行。

【讨论】:

不幸的是,它不起作用。我将关联更改为 ManyToMany,但 Hibernate 仍然创建非空列。似乎使用 Hibernate 创建的任何关系都必须是 1 到 1 或 1 到 1- 或 1- 到 1-* 但我想创建 1 到 0-1 在我的情况下。更具体地说,我需要 1 个 [form] 与 (1[entry] to 0-1[optional value]) 的倍数相关联。 ManyToMany 是唯一的而不是非空的。对于 1-to-0-1,您不需要 JoinTable。您需要一个父表和一个对父表 PK 具有 FK 的子表。您可以将其与 OneToOne 关联进行映射。如果有子记录,那么你有一个 1 对 1,否则你有一个 1 对 0。子节点必须是关联的所有者,而父节点使用 mappedBy。 好的,但是如何把它放到地图中呢?如您所见,我希望拥有多个具有多个条目定义的表单,并且该定义具有可选值。换句话说,条目定义的每个实例在每个表单中都可能具有不同的值,因此我不能在条目定义和条目值之间创建一对一的关联。我可以在 FormEntryDefinition 类中创建 map(form,value),但它仍然是具有可为空值的映射,我无法使用 JPA 创建。 那么 JPA 是否因为不允许空值而破坏了 Java Map 契约?

以上是关于jpa中的可空映射映射的主要内容,如果未能解决你的问题,请参考以下文章

使用固定值映射 JPA 中的枚举?

jpa 实体bean中如何定义非映射字段

修剪 JPA 中的映射列

基于其他两个实体映射相关的 JPA 实体映射

JPA中的多对多双向映射

如何处理 JPA @OneToOne 映射中的“孤立”行