【问题标题】:JPA: How do I set up an entity with several children and several parents of same entity type?JPA:如何设置具有多个子级和多个父级的相同实体类型的实体?
【发布时间】:2019-08-19 08:52:40
【问题描述】:

我正在尝试为企业实体建模,其中所述企业可以有多个父企业和多个子企业。我不确定哪些关系是合适的,甚至什么映射是合适的。我熟悉 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 ---

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

【问题讨论】:

  • 您需要@ManyToMany 关系和一个包含它们的中间表。您的方案未描述 @OneToMany 映射。
  • @JoinTable 可以工作吗?

标签: java hibernate jpa orm hierarchy


【解决方案1】:

您当前的映射在语法上不正确,因为关系中只有一方可以是拥有方。拥有方是由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控制连接表和列的名称。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2016-05-02
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2012-10-06
    • 2020-04-23
    相关资源
    最近更新 更多