如何让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应用程序。
答案 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属性。但是你必须非常确定哪一方是读写(在控制中)哪一方是只读(反向)。不必要的更复杂。