Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA Hibernate多个非唯一密钥_Hibernate_Jpa_Many To Many_Formula - Fatal编程技术网

JPA Hibernate多个非唯一密钥

JPA Hibernate多个非唯一密钥,hibernate,jpa,many-to-many,formula,Hibernate,Jpa,Many To Many,Formula,我有两个实体(表):部门和个人。两个表的字段代码都不是唯一的 如何定义这些表之间的许多双向关系 部门有收款人,其中包含所有具有Person.CODE eq Department.CODE的实体 合作伙伴有收集部门,其中包含所有具有Department.CODE eq Partner.CODE的实体 我需要关系定义-无sql或hpql查询 用HPQL做这件事没有问题,但我需要注释 为给定的部门ID选择人员: select P.* from Person P, Deparment d where

我有两个实体(表):部门个人。两个表的字段代码都不是唯一的

如何定义这些表之间的许多双向关系

  • 部门有收款人,其中包含所有具有Person.CODE eq Department.CODE的实体
  • 合作伙伴有收集部门,其中包含所有具有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公式是可能的?

    您肯定需要数据库中的第三个表来拥有多对多关系,称之为
    department\u person
    。从此表中声明两个外键,它们引用
    人员
    部门

    之后,您可以:

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


    2) 在两个初始实体之一中定义一个多对多关系,说明
    部门人员
    是该关系的所有者。

    为多对多关系创建联接表没有问题。不幸的是,这并不能解决我的问题。如果我使用MTM关系并使用现有代码插入更新的部门,我将不得不将所有人员分配到新部门。我不完全理解这个问题。您的意思是您必须更新保持相同代码的特定部门的数据,还是您必须更新特定关系?由于是多对多,您可以将多人分配到一个部门和多个部门,每个人都可以成为其中的一员。我有一个代码为“XXX”的部门,名称为“Dep1”,共有20人。我插入代码为“XXX”和新名称为“Dep1已编辑”的新部门实体。(当然,每个实体都有validFrom,validTill)。如果我使用MTM关系,我必须手动将20人分配到新部门(填写关系表)。因此,如果我理解得很好,你真正想要的是避免创建关系保留表,因为创建关系的工作量将是相当大的。我不知道这样做是否有帮助,但是保存这种关系的唯一其他方法是使用逗号分隔的值来保存从一个表到另一个表的多个外键。我知道这不是一个优雅的解决方案,但这是避免第三张桌子的唯一方法。这两张桌子工作得很好。编写返回适当集合的SQL或HPQL查询并没有问题。您不需要CSV或第三个表,因为搜索键在两个表中(来自两个表且代码相同的记录属于一起)。但是我不能为它编写JPA注释