OneToMany关系中的复合唯一约束

时间:2014-08-04 18:16:53

标签: java spring hibernate spring-mvc jpa

如何让JPA在Many关系的OneToMany一侧强制执行复合唯一约束的唯一值?

在下面的代码中,我有一个Person实体,其内部id,并且还有一组外部复合orgids,用于标识{{1}与其他组织的关系。这些外部复合ID由标识特定patient的{​​{1}}组件和标识{1}}的{​​{1}}组成。 root。因此,organization / extension的组合在与person相关联的organization集合中必须是唯一的。如何设置代码才能完成此任务?

下面的代码一直试图在root中插入冗余的root / extension值,尽管由于下面的DDL中的Unique约束,MySQL数据库会拒绝这些插入尝试。

orgids

这是一个使用hibernate和jpa的Spring mvc应用程序。

1 个答案:

答案 0 :(得分:1)

本质上,PersonID表本身不是一个实体,而是Person和Organization之间的链接表。您可以将此关联映射为Hibernate / JPA中的Map,使用(在个人方面)组织作为键,扩展名作为值。 (您也可以在组织方面映射扩展名为关键字)

但是很难在PersonID表上维护PK。然而,这个领域似乎是多余的。您可以删除它并添加通常在Map映射表上使用的约束。

在你的情况下,我会创建一个类结构,其中person具有Map< Organization,String>。这将被映射为@ElementCollection,其中@CollectionTable用于PersonID表,而@MapKeyJoinColumn用于引用Organization表。这样PersonID就没有生成的ID列。 PK将是对人员和组织的FK列的约束。您可以在Fk上向组织和扩展列添加唯一约束,以确保没有重复的ID。

或者,您可以将PersonID维护为实体,它们存储在地图中并使用双向关联返回Person,并在Map< Organization,PersonID>上映射MapKey。和PersonID.organization属性。但是你必须非常确定哪一方是读写(在控制中)哪一方是只读(反向)。不必要的更复杂。