我正在尝试建立一个业务实体的模型,其中所说的业务可以有几个母公司和几个子公司。我不确定哪种关系合适,甚至不确定哪种映射合适。我熟悉SQL,但对Java ORM还是陌生的。

我的想法是,一个企业可以有很多或没有孩子,而一家企业可以有很多或没有父母。因此,我尝试将两者都设置为OneToMany,也都设置为OneToMany,两者均导致此错误:Illegal use of mappedBy on both sides of the relationship.

实现:

@Entity
public class Business{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parentOrgs")
    private Collection<Business> chlidOrgs;

    @OneToMany(mappedBy = "chlidOrgs")
    private Collection<Business> parentOrgs;

    // --- Getters and setters below ---


我在这里不明白什么?任何和所有帮助非常感谢。

最佳答案

您当前的映射在语法上是错误的,因为关系的只有一方可以是拥有方。拥有方是mappedBy属性的值定义的字段。可以从here找到更详细的说明。

同时从一侧删除mappedBy不能解决问题,因为OneToMany的对等必须是ManyToOne。从两侧将其删除会给我们留下两个单域关联,这也不是必需的。

因为每个Business可以有多个父级,并且似乎也可以直接导航到子级,所以解决方案是使用双向ManyToMany

@Entity
public class Business {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToMany(mappedBy = "parents")
  private Collection<Business> childrens;

  @ManyToMany
  private Collection<Business> parents;
}


从数据库的角度来看,这意味着以下表格:

Business(id)
Business_Business(childrens_id, parents_id)


必要时,可以通过JoinTable控制联接表和列的名称。

10-06 05:44