如何映射 JPA 一对多关系以进行级联删除

时间:2021-03-31 22:04:25

标签: java database jpa entity rdbms

我真的很困惑如何将 JPA 一对多关系映射,以便我可以级联删除。

我有院子

    @Data
    @Entity
    @Table(name = "yard", schema = "example")
    public class Yard {
        @Id
        @OneToMany(cascade= CascadeType.REMOVE, orphanRemoval = true)
        @Column(name="yard_num")
        long yardNum;

        @Column(name="sqft")
        Integer sqft;
    }

和花

    @Data
    @Entity
    @Table(name = "flower", schema = "example")
    public class Flower {
        @Id
        @Column(flower_id)
        long flowerId

        @ManyToOne(cascade= CascadeType.ALL)
        @JoinColumn(name="yard_num")            
        long yardNum;
     
        @Column(name="num_petals")
        Integer numPetals;
    }

一个院子可以有很多花,也可以没有花,但每朵花只需要一码。如果一个院子被删除,花也应该被级联删除。 Flower 上有一个 yard_num 的外键。

我认为这是从 Yard 到 Flower 的单向 OneToMany。但是我在 Yard 的 yardNum 上放置 OneToMany 标签并在 Flower 的 yardNum 上放置 @ManyToOne 标签时出错。为什么这些需要是集合?我的其他标签是否正确(JoinColumn)?

1 个答案:

答案 0 :(得分:0)

如果 Yard 可以有很多 Flowers,正如您提到的,那么概念是实体 Yard 必须包含一组实体 <强>花(不是多头等),顺便说一句,也许是空的。并且实体Flower必须有一个实体Yard(不是Yard的id)

我将提供一个实体映射,未经测试,但想法是我上面提到的:

院子:

@Data
@Entity
@Table(name = "yard", schema = "example")
public class Yard {

  @Id
  @Column(name="yard_num")
  Long yardNum;

  @OneToMany(mappedBy = "yard", cascade = CascadeType.REMOVE, orphanRemoval = true)
  List<Flower> flowers = new ArrayList<>();

  @Column(name = "sqft")
  Integer sqft;
}

花:

@Data
@Entity
@Table(name = "flower", schema = "example")
public class Flower {
    @Id
    @Column(name="flower_id")
    Long flowerId

    @ManyToOne
    // you have to define FK to table "yard" here, if its name is "yard_num" so it's OK
    @JoinColumn(name="yard_num")           
    Yard yard;
    
    @Column(name="num_petals")
    Integer numPetals;
}
相关问题