无法删除或更新父行 - 使用Hibernate的JPA

时间:2010-07-22 20:47:12

标签: sql mysql hibernate jpa mysql-error-1451

我有一个数据库,其中所有表都是由Java JPA / Hibernate代码生成的。我需要以类似于此的方式更新我的数据库中的几个表,

UPDATE Department SET id=100000 WHERE id=0;

不幸的是,这会导致错误

  

错误1451(23000):无法删除或更新父行:外键约束失败(departmentuserlink,CONSTRAINT FK96AF44EAB09C41C5 FOREIGN KEY(department_id)REFERENCES部门(id))

以下是Java实体:

@Entity
@Table(name="Department")
public class Department extends AbstractEntity implements IAbstractEntity {

@OneToMany(cascade=CascadeType.ALL, mappedBy="department", fetch=FetchType.EAGER)
private Set<DepartmentJobLink> departmentJobs = new HashSet<DepartmentJobLink>(0);

    //Setters & getters and all that
}



@Entity
@Table(name="edrDepartmentJobLink",     uniqueConstraints={@UniqueConstraint(columnNames={"department_id", "job_id"})})
public class DepartmentJobLink extends AbstractEntity implements IAbstractEntity {

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="department_id", nullable=false)
private Department department;

    //Setters & getters and all that
}

他们都在超类中拥有ID。到目前为止,看起来其他所有关于它们的工作都很好,只是在更新Department的主键时遇到了麻烦。我很感激任何建议。感谢。

1 个答案:

答案 0 :(得分:2)

那么,正在更新的表有哪些外键?听起来你不能改变department.id的值,因为其他一些表的department_id列指向department.id时有一个外键约束。

这实际上是“一件好事”,因为这意味着您的数据是可靠的。

您需要更改更新语句,以便同时更新受影响的表的department_id列以及department.id(以及任何其他受影响的表),或者您可以选择{{} 1}}外键约束,以便更改级联。执行此操作的语法因数据库实现而异。

这实际上与JPA或Hibernate没有任何关系 - 它纯粹是数据库中声明的外键约束的结果(可能来自Hibernate映射并从Hibernate模式自动生成数据库模式)生成器工具,但现在无关紧要了。)