[英]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.