9

hibernate 最佳实践指出多对多关联很少见,应该避免。

不要使用奇异的关联映射:

真正多对多关联的实际测试用例很少见。大多数时候,您需要存储在“链接表”中的附加信息。在这种情况下,最好使用两个一对多关联到一个中间链接类。事实上,大多数关联都是一对多和多对一的。因此,在使用任何其他关联样式时应谨慎行事。

一个基本且常见的情况是:用户可以在多个团队中,而一个团队可以有多个成员。

除了为连接表创建实体之外,还有其他方法可以使用 @ManyToMany 吗?在团队/成员的情况下,join 表中没有额外的数据,因此让 Team>TeamMembership>User 不太实用。

4

2 回答 2

10

使用本质上没有任何问题,@ManyToMany但在实践中,你很少有机会使用它。通常,您需要链接本身的附加属性,此时,关系将成为它自己的实体。

我的经验中的一个例子是你描述的那种人/团队关系。@ManyToMany起初我使用了 a ,但必须将其转换为@OneToMany一旦我需要在关系上添加生效日期(此人在特定时间点属于团队)。

于 2013-09-03T14:03:14.873 回答
6

@ManyToMany 的问题之一是模型发生了变化。如果您需要向关联中添加一个字段,那么您有几个选择。您可以重构模型,使关联成为实体(读取链接类)。或者您可以使关联更加奇特,例如@MapKeyJoinColumn。无论哪种情况,都可以通过首先设计模型来节省未来的重构工作。

此外,使用这些奇异的多对多映射之一往往会使模型更接近测试覆盖率较低且实际使用率较低的边缘情况。这反过来又增加了遇到不受支持或支持不足的功能以及未解决和未发现的错误的风险。

最后,仅仅因为 hibernate 为您提供了一种方法,并不意味着您应该使用它。在我的经验中,我见过太多的案例,即开发人员在 hibernate 中使用某个特性的方式并非意料之中,这会导致其他设计影响,以及导致更多麻烦和头痛的限制,而不是它们的价值。

于 2014-01-24T05:30:26.327 回答