休眠级联删除操作无法按预期进行

问题描述

| 我正在使用休眠3,并尝试删除数据库中的一条记录,并且删除无法正常运行。休眠模式正在针对(使用伪代码):
create table Employer(
    employer_id number(12) primary key,employer_name varchar2(50)
);

create table Employee(
    employee_id number(12) primary key,employee_name varchar2(50),employer_id number(12) foreign key references employer.employer_id not null
);

create table Employee_Roles(
    role_id number(12) primary key,employee_id number(12) foreign key references employee.employee_id not null,role varchar2(50)
);
我的休眠类映射如下所示:
@Entity
public class Employer{

    @Id
    @Column(name = \"EMPLOYER_ID\")
    private long id;

    @Column
    private String name;


    @OnetoMany(targetEntity = Employee.class,fetch = FetchType.EAGER)
    @JoinColumn(name = \"employer_id\")
    @Cascade(CascadeType.ALL)
    private Set<Employee> employees;
}

@Entity
public class Employee{

    @ManyToOne(targetEntity = Employer.class)
    @JoinColumn(name = \"employer_id\")
    @Cascade(value = CascadeType.SAVE_UPDATE)
    private Employer employer;

    @OnetoMany(targetEntity = EmployeeRole.class,fetch = FetchType.EAGER)
    @JoinColumn(name = \"employee_id\")
    @Cascade(CascadeType.ALL)
    private Set<Employee> employees;
}

@Entity
public class EmployeeRole{

    @ManyToOne(targetEntity = Employee.class)
    @JoinColumn(name = \"employee_id\")
    @Cascade(value = CascadeType.SAVE_UPDATE)
    private Employee employee;
}
现在,使用此配置,我正在调用
getCurrentSession().delete(someEmployerEntity);
正在发生的是:
Hibernate: update EMPLOYEE set EMPLOYEE_ID=null where EMPLOYEE_ID=?
Hibernate: update EMPLOYEE_ROLE set employee_id=null where employee_id==?
[2011-04-15 15:59:53,487] JDBCExceptionReporter WARN  - sql Error: -10,sqlState: 23502
[2011-04-15 15:59:53,487] JDBCExceptionReporter ERROR - integrity constraint violation: NOT NULL check constraint; SYS_CT_10058 table: EMPLOYEE_ROLE
并且提出了一个例外。通过session.remove(..)调用,我期望删除的雇主记录以及与该雇主相关的所有雇员记录以及与已删除的雇员记录相关的所有EmployeeRole记录。这是正确的假设吗?还是我误解了这里的关键概念?     

解决方法

级联全删除孤儿应该解决您的问题。但是,它是Hibernate的一部分,而不是EJB标准。如果您想这样做,并且不会陷入供应商的解决方案中,建议您阅读本文。 祝好运! 编辑:按照您的建议,我在@OneToMany批注中添加了\'mappedBy \'属性,这似乎是使用inverse = \“ true \”来指定拥有关系的批注方式。关系的相关更改部分如下所示:
public class Employee{

    @OneToMany(targetEntity = EmployeeRole.class,mappedBy=\"employee\",fetch = FetchType.EAGER,cascadeType=CascadeType.ALL)
    private Set<EmployeeRole> employeeRoles;
}


public class Employer{

    @OneToMany(targetEntity = Employee.class,mappedBy=\"employer\",cascadeType=CascadeType.ALL)
    private Set<Employee> employees;
}