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

时间:2019-08-08 09:45:03

标签: mysql database hibernate jpa cascade

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

用户:

@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;
}

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

1 个答案:

答案 0 :(得分:1)

级联操作的说明在底部。

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

@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;
}

在Order实体中(在代码中)没有对User的引用时,称为单向关系。您可以在订单中添加引用,以使关系成为双向。

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

@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关系上的

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

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

对于双向方法,如果每个用户只需要一个订单怎么办?

最简单的方法是用两边的@OneToOne来更改@ OneToMany,@ ManyToOne。 @OneToOne关系的默认可选属性为true,这意味着用户不需要定单。 其他解决方案可能是使用@MapsId批注。还有其他。最好的方法取决于某些条件,例如,如果必须在关系中同时设置两个实体,并且要对@OneToOne进行延迟加载,则必须具有双向关系还是单向关系就足够了。