簡體   English   中英

休眠:如何級聯刪除?

[英]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端設置級聯
  • 在刪除用戶之前(通過查詢)找到屬於他的所有軟件包,然后刪除它們。
  • 如果程序包沒有其他任何級聯,請使用HQL查詢: 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.

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