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中的可空映射映射的主要内容,如果未能解决你的问题,请参考以下文章