JPA 多对多和 mappedBY

Posted

技术标签:

【中文标题】JPA 多对多和 mappedBY【英文标题】:JPA ManyToMany and mappedBY 【发布时间】:2015-05-22 14:43:41 【问题描述】:

我完全理解@OneToMany、@ManyToOne 和@ManyToMany。但是 mappedBy = "some collection or class" 被混淆了。

据我了解,很多部分始终是拥有方。例如,

 @Entity
 @Table(name = "company")
  public class CompanyEntity implements Serializable 
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idcompany")
    private Integer idcompany;
    @Basic(optional = false)
    @Column(name = "name")
    private String name;
    @Basic(optional = false)
    @Column(name = "address")
    private String address;

    @OneToMany
    private Collection<EmployeeEnity> employeeEnity 

这是说一家公司可以有很多员工。一个是公司,许多是员工。

但是,@ManyToMany 我们仍然有相反的一面。这是我不明白的。 @ManyToMany 只是表示中间有一张桌子,那么如何确定逆和所有者?

我知道 mappedBy 是强制性的,但选择放置它的位置让我感到困惑。

【问题讨论】:

【参考方案1】:

对于双向 OneToMany,多方必须是所有者方。

对于多对多,您可以选择:您决定哪一边是所有者一边,哪一边是反面。

请注意,在您的示例中,关联是单向的,因此唯一的一侧(一侧)显然是所有者一侧,或者关联是双向的,因此映射是不正确的,因为一侧必须是相反的一面,因此应该有一个mappedBy 属性:

@OneToMany(mappedBy = "company")
private Collection<EmployeeEntity> employees;

【讨论】:

我有一个选择,是的,它正在做出这个选择。例如:一个公司可以有很多客户,一个客户可以有很多公司。谁是独一无二的? 没有人是独一无二的。 Unicity 与您的问题无关。您可以选择让公司成为所有者或客户。你决定。

以上是关于JPA 多对多和 mappedBY的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot JPA无限循环多对多

带有额外列的 JPA 2.0 多对多 - 更新集合

JPA 2:通过不在带有额外字段的多对多中工作来订购

如何判断一对一对多和多对多的关系

具有一对多和多对多关系的 JOOQ pojos

多对多和形式 Symfony2