2011-05-10 35 views
1

我有两个对象。让它成为公司和员工。如何用Hibernate删除相互关联的对象

CREATE TABLE company (
    company_id BIGINT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    chief_id BIGINT(20) NOT NULL, 
    PRIMARY KEY (company_id), 
    CONSTRAINT fk_company_chief 
    FOREIGN KEY (chief_id) 
    REFERENCES employee (employee_id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION); 

CREATE TABLE employee(
    employee_id BIGINT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    company_id BIGINT(20) NOT NULL, 
    PRIMARY KEY (employee_id), 
    CONSTRAINT fk_employee_company 
    FOREIGN KEY (chief_id) 
    REFERENCES employee (company_id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION); 

而且我的课是这样的:

class Employee { 
    long id; 
    String name; 
    Company company; 
} 

class Company{ 
    long id; 
    String name; 
    Employee chief; 
} 

然后我想删除公司所有员工。我在一次交易中完成。我越来越像"java.sql.BatchUpdateException: Column 'chief_id' cannot be null"

我能够删除后,使其中一列可以为空。例如“chief_id BIGINT(20)NULL”,然后在删除前使company.chief = null。

在项目中,我们不使用Hibernate级联,我无法更改数据库级联。

我们使用的是MySql 5.0。

我需要smth像:禁用约束 - >删除实体 - >启用约束。禁用状态只能在当前事务中访问。我认为这是默认行为。

+0

你没有在这里指定JPA注释,我希望它的1 .. *(公司 - 员工)关系是什么,你可以添加nullable = true在POJO中通过ID定义的注释,是否有意义? – Narayan 2011-05-10 16:05:02

回答

0

您应该使用Hibernate级联。禁用/启用数据库约束是DDL操作并立即提交,无法将“禁用状态”与其他事务性上下文隐藏起来。

1

如果你的数据库管理系统支持它,你可以声明你的一个约束条件为deferrable initially deferred,以便在事务结束时检查它。

+0

我喜欢你的解决方案!但是我们使用的是Mysql 5.0,我无法使用它。谢谢! – Zalivaka 2011-05-11 07:33:01

+0

我想知道如果MySql立即执行检查,这个相关数据是如何保存的? – Zalivaka 2011-05-11 07:46:35

0

如果您不能使用Hibernate级联,您可以做的是使用虚拟公司(例如company_id = -1)和虚拟主要Employee对象(employee_id = -1)。 DummyChief属于DummyCompany公司,DummyCompany的负责人是DummyChief。

然后,您可以进行以下顺序:

1 /删除所有非首席员工在公司。

2 /设定公司首席员工DummyChief(EMPLOYEE_ID = -1)

3 /删除行政雇员。

4 /删除公司公司。

相关问题