删除子级联类型时删除父级



我很难弄清楚级联类型的概念。假设我有两个类,用户和订单。某些用户可能有订单,因此我在订单中引用了用户。

用户:

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String phone;
private String email;
}

次序:

@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
private User owner;
private int price;
}

我希望在删除相应用户时删除订单。怎么做?

级联操作的说明在底部。

您的问题标题"删除子级联类型时删除父级"。不建议在删除子项时,也会删除父项。但是,如果要使用它,则应修改订单实体(单向关系,因为用户实体中没有订单引用(。

@Entity public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade = CascadeType.ALL) 
or when only cascading for the removal @ManyToOne(cascade=CascadeType.REMOVE) 
@JoinColumn(name = "USER_ID")
private User owner;
private int price;

更好的是更改实体。某些用户可能有订单。所以我会向用户添加注释@OneToMany。

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String phone;
private String email;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "USER_ID")
private List<Order> orders
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int price;
}

当订单实体(上面的代码(中没有对用户的引用时,它称为单向关系。您可以在订单中添加参照,使关系是双向的。

一个典型的双向关系示例:

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String phone;
private String email;
@OneToMany(cascade = CascadeType.ALL, mappedBy="owner");
private List<Orders> orders
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "USER_ID")
private User owner;
private int price;
}

在用户@OneToMany关系上级联 CascadeType.ALL 意味着对用户实体的所有操作都将传播到订单实体。因此,当删除用户时,所有订单列表"订单"属性也将被删除。您可以定义一些级联类型。例如,当您删除用户时只有CascadeType.MOVE,它的订单列表也将被删除,但是当您保存用户时,订单将不会保存。在大多数情况下,CascadeType.ALL很受欢迎,建议在关系的@OneToMany端使用。

如果您需要阅读有关级联数据库操作的更多信息,请访问以下链接: https://www.baeldung.com/jpa-cascade-types。

对于双向方法,如果我只想为每个用户下一个订单怎么办?

最简单的方法是更改@OneToMany,@ManyToOne两侧都有@OneToOne。@OneToOne关系的默认可选属性为 true,这意味着用户不需要有订单。 其他解决方案可能是使用@MapsId注释。还有其他的。最好的方法取决于一些标准,例如,如果必须在关系中设置两个实体,如果要延迟加载@OneToOne,则是否必须具有双向关系或单向关系就足够了。

最新更新