[英]Hibernate:How to delete in cascade?
我有以下課程:
//Product class
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
//Package Class
public class Package {
@Id
@GeneratedValue
private Long id;
@OneToOne(cascade=CascadeType.ALL)
private Product product;
private int quantity;
private char mode;
private String unity;
private String description;
@OneToOne(cascade=CascadeType.ALL)
private Usuario user;
public class User {
@Id
private String email;
我可以插入一個產品,一個用戶和一個包,就可以了:
//.. (iniatilize product and user before and set in package object)
session.save(package);
session.getTransaction().commit();
那么,為什么我不能刪除用戶?
User user = new User();
user.setEmail("valter@gmail.com");
session.delete(user);
session.getTransaction().commit();
給我這個錯誤:
無法刪除或更新父行:外鍵約束失敗
完整實體用戶
@Entity
public class Usuario {
@Id
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Entity
public class Package{
@Id
@GeneratedValue
private Long id;
@OneToOne(cascade=CascadeType.ALL)
private Product product;
private int quantity;
private char mode;
private String unity;
private String description;
@OneToOne(cascade=CascadeType.ALL)
private User user;
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
這就是系統中涉及的所有實體。
@Bozho根據您所說的,應該是這樣嗎?
@Entity
public class User{
@Id
private String email;
@OneToOne(cascade=CascadeType.ALL)
private List<Package> packages;
我正在嘗試執行此方法:
private static void deleteUser() {
Session session = new HibernateUtil().getSession();
session.beginTransaction();
try{
User usuario = (Usuario) session.load(Usuario.class, "valter@gmail.com");
session.delete(usuario);
session.getTransaction().commit();
}catch(HibernateException he){
session.getTransaction().rollback();
}finally{
session.close();
}
}
看來您正在創建一個分離的實體並試圖刪除它,而不是從數據庫中獲取完整的實體。 在這種情況下,即使您定義了級聯,它們也將不起作用,因為未填充User
實體的和關系。
如果電子郵件是主鍵,則應執行以下操作:
User user = session.load(User.class, "foo@bar.com");
session.delete(user)
即使這樣,如果任何其他實體引用了User
,它在邏輯上也會失敗-只看數據庫約束。 您可以通過多種方法來解決此問題:
List<Package>
,從而使關系成為雙向。 因此,您也可以在User
端設置級聯 DELETE FROM Package WHERE user=:user"
。 您應該添加orphanRemoval = true。
@OneToOne(cascade = CascadeType.ALL,orphanRemoval = true)私人Usuario用戶;
嘗試也更新您的包類,例如
private static void deleteUser(Package package) {
Session session = new HibernateUtil().getSession();
session.beginTransaction();
try{
User usuario = (Usuario) session.load(Usuario.class, "valter@gmail.com");
package.setUser(null);
session.merge(package);
session.delete(usuario);
session.getTransaction().commit();
}catch(HibernateException he){
session.getTransaction().rollback();
}finally{
session.close();
}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.