@ManyToMany(mappedBy = "foo")

Posted

技术标签:

【中文标题】@ManyToMany(mappedBy = "foo")【英文标题】: 【发布时间】:2012-12-16 04:53:24 【问题描述】:

Foo 有:

@ManyToMany(mappedBy = "foos")
private Set<Bar> bars

而酒吧有:

@ManyToMany
private Set<Foo> foos

除了table是叫foo_bar还是bar_foo之外,mappedBy属性的位置对双向关系有什么不同;如果没有 mappedBy 属性,我会得到两个连接表,foo_bar 和 bar_foo。

【问题讨论】:

foo 和 bar 确实是一个糟糕的词选择。请考虑现实世界中存在的关系的更具体示例。 【参考方案1】:

The documentation 说:

如果关联是双向的,一侧必须是所有者,一侧必须是反向端(即更新关联表中的关系值时将被忽略):

因此,具有mappedBy 属性的一面是反面。没有mappedBy 属性的一方是所有者。

所有者方是 Hibernate 查看以了解存在哪个关联的一方。因此,例如,如果您在 Bar 的 foo 集合中添加一个 Foo,Hibernate 将在连接表中插入一个新行。相反,如果您将 Bar 添加到 Foo 的 bar 集合中,则不会在数据库中修改任何内容。

【讨论】:

如果我希望它们相互反映,如果添加了一个应该修改 db 的栏? @NimChimpsky:在双向关系中,当您更改 Foo.bars 时,您应该相应地更改 Bar.foos,因此您不应该关心在修改什么时保存在数据库中的内容. “所有权”概念只是关于数据库组织,你的代码应该完全不了解它。 你有一个双向关联:当你将 bar 添加到 foo 时,也将 foo 添加到 bar。 @RyanStewart “当你改变 Foo.bars 时,你应该相应地改变 Bar.foos,所以当你修改什么时你不应该关心保存在数据库中的什么。” ...对我来说,这听起来很矛盾。【参考方案2】:

mappedBy 告诉 Hibernate 关系的哪一方“拥有”链接。在OneToManyOneToOne 中,使用mappyedBy 告诉Hibernate 在另一个表中会有一个外键用于存储链接。

ManyToMany 有一个连接表,所以两者都没有直接链接到另一个对象。但是,hibernate 仍然需要知道哪个是“拥有”方,知道如何级联操作。

【讨论】:

-1:mappedBy不表示哪个表有外键,和级联无关。

以上是关于@ManyToMany(mappedBy = "foo")的主要内容,如果未能解决你的问题,请参考以下文章

码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable

关系/对象映射 多对多关系(@ManyToMany 注释)重新认识

JPA 多对多和 mappedBY

hibernate的注解属性mappedBy详解

hibernate的注解属性mappedBy详解

Hibernate中,mappedBy和注解@JoinColumn的对比