hibernate最佳实践表明,多对多关联很少见,应该避免使用。
不要使用异国情调的关联映射:
真正的多对多关联的实际测试用例很少见。最 当你需要存储在“链接”中的其他信息时 在这种情况下,使用两个一对多要好得多 与中间链接类的关联。事实上,大多数协会 是一对多和多对一的。出于这个原因,你应该继续 使用任何其他协会风格时要小心。
基本和常见的情况是:用户可以在多个团队中,团队可以有多个成员。
除了为连接表创建实体之外,是否有使用@ManyToMany的替代方法?对于团队/成员,联接表中没有其他数据,因此拥有Team> TeamMembership> User并不是那么实用。
答案 0 :(得分:7)
使用@ManyToMany
没有任何本质上的错误,但在实践中,您很少有机会使用它。通常,您需要链接本身的其他属性,此时,关系将成为自己的实体。
根据我的经验,一个例子就是你所描述的那种人/团队关系。我最初使用@ManyToMany
,但是一旦我需要在关系上添加生效日期(人员在特定时间点属于团队),就必须将其变为@OneToMany
。
答案 1 :(得分:5)
@ManyToMany的一个问题是模型会发生变化。如果您需要向关联添加字段,那么您有几个选择。您可以重构模型,以便关联成为实体(读取链接类)。或者你可以使关联更具异国情调,例如@MapKeyJoinColumn。无论哪种情况,都可以通过首先设计模型来节省未来的重构工作。
此外,使用这些奇异的多对多映射之一往往会使模型更接近测试覆盖率较低且实际使用率较低的边缘情况。这反过来又增加了遇到不支持或不支持的功能以及未解决和未发现的错误的风险。
最后只是因为hibernate为你提供了一种方法,并不意味着你应该使用它。我在开发人员使用hibernate中的某个特性的经历中看到了太多的案例,这种方式不是导致其他设计含义的,而是导致更多麻烦和头痛的限制。