如何使用Hibernate删除相互关联的对象

时间:2011-05-10 15:58:45

标签: java hibernate mapping persistence

我有两个对象。让它成为公司和员工。

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。

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

3 个答案:

答案 0 :(得分:1)

如果您的DBMS支持它,您可以将您的一个约束声明为deferrable initially deferred,以便在事务结束时检查它。

答案 1 :(得分:0)

你应该使用Hibernate级联。禁用/启用数据库约束是一个DDL操作,它立即提交,无法从其他事务上下文中隐藏“禁用状态”。

答案 2 :(得分:0)

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

然后您可以按以下顺序进行操作:

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

2 /将公司主要员工设置为DummyChief(employee_id = -1)

3 /删除首席雇员。

4 /删除公司公司。