Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 移除子级时移除父级级联类型_Mysql_Database_Hibernate_Jpa_Cascade - Fatal编程技术网

Mysql 移除子级时移除父级级联类型

Mysql 移除子级时移除父级级联类型,mysql,database,hibernate,jpa,cascade,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 St

我很难理解级联类型的概念。假设我有两个类,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;
}
我希望在删除相应用户时删除订单。如何做到这一点?

级联操作的说明在底部

您的问题标题为“移除子级时移除父级级联类型”。不建议在删除子对象时也删除父对象。但是如果您想拥有它,您应该修改订单实体(单向关系,因为用户实体中没有订单引用)

更好的方法是改变实体。一些用户可能有订单。因此,我将向用户添加注释@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;
}
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名;
私有字符串lastName;
私人电话;
私人字符串电子邮件;
@OneToMany(级联=级联类型.ALL)
@JoinColumn(name=“USER\u ID”)
私人名单订单
}
@实体
公共阶级秩序{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私人int价格;
}
当订单实体(上面的代码)中没有对用户的引用时,它被称为单向关系。可以按顺序添加引用,使关系双向

典型的双向关系示例:

@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;
}
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名;
私有字符串lastName;
私人电话;
私人字符串电子邮件;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“owner”);
私人名单订单
}
@实体
公共阶级秩序{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@许多酮
@JoinColumn(name=“USER\u ID”)
私人用户所有者;
私人int价格;
}
User@OneToMany关系上的cascade CascadeType.ALL表示用户实体上的所有操作都将传播到订单实体。因此,当删除用户的所有订单时,属性列表“订单”也将被删除。您可以定义一些级联类型。例如,如果只有CascadeType.REMOVE,则在删除用户时,其订单列表也将被删除,但在保存用户时,不会保存订单。在大多数情况下,CascadeType.ALL很受欢迎,建议在关系的@OneToMany一侧使用

如果您需要阅读有关级联DB操作的更多信息,请访问以下链接:


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

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

对于双向方法,如果我只想让每个用户有一个订单呢?
@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;
}