簡體   English   中英

移除子級時移除父級級聯類型

[英]Remove parent when child is removed cascade type

我無法弄清楚級聯類型的概念。 假設我有兩個類,用戶和訂單。 一些用戶可能有訂單,以便我在訂單中引用用戶。

用戶:

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

我希望在刪除相應用戶時刪除訂單。 怎么做?

級聯操作的說明在底部。

您的問題標題為“移除子級聯類型時移除父級”。 不建議在刪除子項時,同時刪除父項。 但是如果你想擁有它,你應該修改 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;
}

在 User @OneToMany 關系上級聯 CascadeType.ALL 意味着 User 實體上的所有操作都將傳播到 Order 實體。 因此,當從用戶中刪除所有訂單時,屬性列表“訂單”也將被刪除。 您可以定義一些 CascadeType。 例如,當您刪除用戶時只有 CascadeType.REMOVE 時,它的訂單列表也將被刪除,但當您保存用戶時,訂單將不會被保存。 在大多數情況下,CascadeType.ALL 很受歡迎,並建議在關系的 @OneToMany 一側使用。

如果您需要閱讀有關級聯數據庫操作的更多信息,請訪問以下鏈接: https : //www.baeldung.com/jpa-cascade-types

對於雙向方法,如果我只需要每個用戶一個訂單怎么辦?

一個最簡單的方法是改變@OneToMany、@ManyToOne 和@OneToOne 兩邊。 @OneToOne 關系的默認可選屬性為 true,這意味着用戶不需要有訂單。 其他解決方案可能是使用 @MapsId 注釋。 還有其他人。 最好的方法取決於一些標准,比如你必須有雙向關系還是單向就足夠了,如果兩個實體都必須在關系中設置,如果你想延遲加載@OneToOne。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM