【问题标题】:JPA Hibernate manyToMany with non-unique key具有非唯一键的 JPA Hibernate manyToMany
【发布时间】:2011-09-30 07:02:21
【问题描述】:

我有两个实体(表):DepartmentPerson。两个表都有一个 CODE 字段,它不是唯一的

如何定义这些表之间的 manyToMany 双向关系?

  1. 部门有集合 Persons,其中包含具有 Person.CODE eq Department.CODE 的所有实体
  2. 合作伙伴有收集部门,其中包含所有具有Department.CODE eq Partner.CODE 的实体

我需要关系定义 - 没有 sql 或 hpql 查询。

用HPQL做是没问题的,但是需要注解。

为给定的部门 ID 选择人员:

select P.* from Person P, Deparment d  
where d.department_id = ? and 
p.code = d.code and 
? between d.validFrom and d.validTill and  
? between p.validFrom and p.validTill 

用hibernate公式可以吗?

【问题讨论】:

    标签: hibernate jpa many-to-many formula


    【解决方案1】:

    您肯定需要数据库中的第三个表来拥有多对多关系,称之为department_person。从此声明两个外键,它们引用 PersonsDepartments 表。

    之后,您可以:

    1) 定义一个新的 JPA 实体 DepartmentPerson 并从每个外键定义多对一关系。因此,您应该创建两个从 Persons 指向的一对多关系 DepartmentPerson 和从 DepartmentDepartmentPerson 产生您需要的集合。

    2) 在两个初始实体之一中定义多对多关系,声明 department_person 是关系的所有者。

    【讨论】:

    • 为manyToMany关系创建连接表没有问题。不幸的是,它并没有解决我的问题。如果我使用 MTM 关系并使用现有代码插入更新的部门,我将不得不将所有人分配到新部门。
    • 我不完全理解这个问题。您的意思是您必须更新特定部门的数据并保持相同的代码,还是您的意思是您必须更新特定的关系?作为多对多,您可以将许多人分配到一个部门和一个人可以成为成员的许多部门。
    • 我的部门代码为“XXX”,名称为“Dep1”,有 20 人。我插入新的部门实体,代码为“XXX”,新名称为“Dep1 已编辑”。 (当然每个实体都有validFrom、validTill)。如果我使用 MTM 关系,我必须手动将 20 人分配给新部门(填写关系表)。
    • 所以如果理解得好,你真正想要的是避免创建关系保存表,因为创建关系的工作量是相当大的。我不知道这是否会有所帮助,但保持这种关系的唯一另一种方法是使用逗号分隔的值来保存从一个表到另一个表的多个外键。我知道这不是一个优雅的解决方案,但它是避免第三张桌子的唯一方法
    • 这两个表运行良好。编写返回适当集合的 SQL 或 HPQL 查询是没有问题的。您不需要 CSV 或第三个表,因为搜索键在两个表中(两个表中具有相同 CODE 的记录属于一起)。 但我无法为其编写 JPA 注释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2020-02-04
    • 2018-02-02
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多