jpa中的Nullable Map映射

时间:2014-11-06 13:33:01

标签: java hibernate jpa orm hibernate-mapping

我正在尝试使用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会生成唯一且非空的约束,所以我不能使用可空值来持久映射?

该问题是否有解决方法?

1 个答案:

答案 0 :(得分:1)

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

连接表FK列仅对非可空列有意义。连接表中的一行是两个表之间的链接,如果缺少一个FK,则无论如何关联都会中断,它等同于首先没有链接行。