如何为级联删除映射 JPA 一对多关系
How to Map a JPA One-to-Many Relationship For Cascade Deletion
我对如何映射 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;
}
一个院子里可以有很多花,也可以没有花,但每朵花恰好需要一个院子。如果一个院子被删除,花朵也应该被级联删除。 yard_num.
在 Flower 上有一个外键
我认为那是从院子到花的单向单对多。但是我在 Yard 的 yardNum 上放置 OneToMany 标签并在 Flower 的 yardNum 上放置 @ManyToOne 标签时出错。为什么这些需要是集合?我的其他标签是否正确 (JoinColumn)?
如果Yard可以有很多Flowers,那么这个概念就是实体Yard 必须包含实体集合 Flowers(不是 longs 等),顺便说一句,可能是空的。并且实体 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;
}
我对如何映射 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;
}
一个院子里可以有很多花,也可以没有花,但每朵花恰好需要一个院子。如果一个院子被删除,花朵也应该被级联删除。 yard_num.
在 Flower 上有一个外键我认为那是从院子到花的单向单对多。但是我在 Yard 的 yardNum 上放置 OneToMany 标签并在 Flower 的 yardNum 上放置 @ManyToOne 标签时出错。为什么这些需要是集合?我的其他标签是否正确 (JoinColumn)?
如果Yard可以有很多Flowers,那么这个概念就是实体Yard 必须包含实体集合 Flowers(不是 longs 等),顺便说一句,可能是空的。并且实体 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;
}