首页 文章

为什么Hibernate文档建议使用连接表来实现一对多关系?

提问于
浏览
9

我认为在数据库中建模一对多关系的常用方法是通过外键关系(即一个客户有很多订单 - >订单表获得对客户表的FK引用) .

但是,Hibernate建议使用连接表来建模这种关系:

在拥有的实体中使用外键列的单向一对多并不常见,也不是真正推荐的 . 我们强烈建议您使用连接表进行此类关联(如下一节中所述) . 这种关联是通过@JoinColumn描述的 .

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

为什么这“不是真的推荐” . 我认为使用FK是标准,并且连接表仅用于多对多关系?

我不喜欢创建连接表,因为数据模型看起来像关系是多对多的,而实际上它是一对多的 .

这个建议在Hibernate文档中的原因是什么?

4 回答

  • 2

    在Hibernate论坛上已经提出并回答了这个问题:https://forum.hibernate.org/viewtopic.php?t=954178&highlight=unidirectional+null+foriegn+foreign+key . 它似乎不是数据库设计的问题,而是更多的Hibernate功能 .

  • 5

    您提供的文档中的引文描述了一个 unidirectional @OneToMany关联,这是另一回事 . 在这样的关联中,您只有从客户到订单的引用,而不是副verca . 因此,应该使用连接表来映射这种关联,并为每个客户保存订单集合 .

    我想您正在考虑的关联更可能是@ManyToOne关联,具有从Order到Customer的引用 .

    请注意,如果要对双向关联建模,可以使用@OneToMany批注中的“mappedBy”属性 .

  • 3

    我不能说任何权威,但我对它的看法一直是单向关系,存在或永远不存在 . 在这个数量上,它也可以更好地反映对象关系 . 在Foo - > Bar的单向一对一中,您拥有对象模型中的所有权 . 这同样适用于来自客户 - >订单的一对多 . 查看对象模型,您不希望在Order中看到所有权,因此也不在Order表中 .

  • 2

    Hibernate文档的前一部分涵盖了双向一对多关系,并描述了您可能习惯的内容,并在许多实体上使用标准外键 . 正如其他人所说,这个答案只适用于你明确需要单向关系的时候 .

    如果多方不了解这种关系,你只需要单向性 . 这意味着很多方面的类不能有一个属性来表示关系,几乎是按照定义 . 因此,请将此问题视为“如何在不使用常规方法的情况下表示一对多关系” .

    想要这样的单向关系肯定有点不寻常,但我可以看到您可能希望它出现解耦,安全性,审计或不变性等原因 . 例如,假设您正在为临床试验建模,并且您的课程是患者和药物,并且在试验期间,您为每位患者提供一组药物 . 您希望在Patient上运行的任何逻辑与药物分配给它们完全分离 . 因此,不像通常那样使用patient.setMedication(),而是创建连接类MedicationPatientMap并调用drug.getMedicationPatientMap() . addPatient(patient) . 然后,您可以通过药物方面的逻辑控制药物对患者的一对多关系的访问 .

    我不认为客户订单就是一个很好的例子,因为通常我们的订单心理模型希望客户可以从中获得 . 而且,实际上,大多数时候你不是

相关问题