java - Hibernate:如何级联删除?

标签 java hibernate orm jpa

我有以下类(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/

相关文章:

java - MySQL/Hibernate - 如何调试不断掉线的 MySQL 池连接?

java - JPA 错误 : duplicate key error when persisting a relationship

python - SQLAlchemy 上下文相关函数,用于在插入和更新时创建复合值

java - OWLAPI : how load ontology having import works?

java - Hibernate实体模式@Table(schema ="<schema-name>"),获取表未找到异常

java - JPOS 多路复用器上并行多个 ISO8583 请求

java - 如果 ID 已存在,则将实体与另一个实体一起保存为属性时出错

sql - 一对多 多对一映射,服务器试图找到一个不存在的表

java - 按键比较两个 HashMap 并返回频率不同的键

java - 在Java中为数组对象赋值