gpt4 book ai didi

java - Hibernate:如何级联删除?

转载 作者:行者123 更新时间:2023-12-02 00:45:16 25 4
gpt4 key购买 nike

我有以下类(class):

//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();

给我这个错误:

Cannot delete or update a parent row: a foreign key constraint fails

我的类(class)出了什么问题?

完整的实体用户

@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 ,它在逻辑上会失败 - 只需查看数据库约束。您有多种方法可以解决此问题:

  • map List<Package>在您的用户中,从而使关系成为双向的。因此,您将能够在 User 上设置级联侧面也是如此
  • 在删除用户之前,找到(通过查询)属于该用户的所有包,并将其删除。
  • 如果包没有任何其他级联,请使用 HQL 查询:DELETE FROM Package WHERE user=:user" .

关于java - Hibernate:如何级联删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com