Hibernate Cascading Delete未按预期工作

Buf*_*alo 5 java hibernate cascading-deletes

我正在使用hibernate 3并尝试删除数据库中的记录,并且删除无法正常工作.模式hibernate正在反对(在伪代码中):

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)
);
Run Code Online (Sandbox Code Playgroud)

我的hibernate类映射看起来像:

@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;
}
Run Code Online (Sandbox Code Playgroud)

现在有了这个配置我打电话:

getCurrentSession().delete(someEmployerEntity);
Run Code Online (Sandbox Code Playgroud)

发生的事情是:

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
Run Code Online (Sandbox Code Playgroud)

并且提出了一个例外.我期待的结果是session.remove(..)调用是要删除的雇主记录,以及与雇主关联的所有员工记录以及与删除的员工记录关联的所有EmployeeRole记录.这是正确的假设吗?或者我在这里误解了一个关键概念?

Mr.*_*ody 4

级联所有删除孤儿应该可以解决您的问题。然而,它是 Hibernate 的一部分,而不是 EJB 标准。如果您想这样做并且不想陷入供应商的解决方案中,我建议您看看这篇文章

祝你好运!

编辑:根据您的建议,我将“mappedBy”属性添加到 @OneToMany 注释中,这似乎是使用 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", fetch = FetchType.EAGER, cascadeType=CascadeType.ALL)
    private Set<Employee> employees;
}
Run Code Online (Sandbox Code Playgroud)

  • 根据您的建议,我找到了解决方案,因为它与关系的所有者有关。我在代码更改中进行了编辑,因此如果将来有人想知道它是什么样子 (2认同)