我有两个对象。让它成为公司和员工。
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。
我需要像:禁用约束 - >删除实体 - >启用约束。禁用状态应仅在当前事务中可访问。我以为这是默认行为。
答案 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 /删除公司公司。