java 休眠级联删除未按预期工作
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5682355/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hibernate Cascading Delete Not working as expected
提问by BuffaloBuffalo
I am using hibernate 3 and attempting to delete a record in the database, and the delete is not working as I would expect. The schema hibernate is working against (in pseudocode):
我正在使用 hibernate 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)
);
My hibernate class mappings look something like:
我的休眠类映射类似于:
@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;
}
Now with this configuration I am calling:
现在有了这个配置,我正在调用:
getCurrentSession().delete(someEmployerEntity);
What is occurring is:
正在发生的是:
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
and an exception being raised. What I am expecting as a result of the session.remove(..) call is the employer record to be deleted, as well as all employee records associated with the employer and all EmployeeRole records associated with the deleted employee records. Is this a correct assumption? Or am I misunderstanding a key concept here?
并引发异常。我期望 session.remove(..) 调用的结果是要删除的雇主记录,以及与雇主关联的所有员工记录以及与已删除员工记录关联的所有 EmployeeRole 记录。这是一个正确的假设吗?还是我在这里误解了一个关键概念?
采纳答案by Mr. Nobody
Cascade all-delete-orphan should solve your problem. However, it is part of Hibernate and not EJB standard. If you want to do it and do not be trapped in your vendors' solution, I would suggest you to have a look to this article.
Cascade all-delete-orphan 应该可以解决您的问题。但是,它是 Hibernate 的一部分,而不是 EJB 标准。如果您想这样做并且不想被供应商的解决方案所困,我建议您看看这篇文章。
Good luck!
祝你好运!
EDIT: following your suggestions I added the 'mappedBy' attributes to the @OneToMany annotations which seems to be the annotations way of using inverse="true" for specifying the owning relationships. The relevant changed sections of the relationships look like:
编辑:按照您的建议,我将 '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;
}