我有一个数据库,其中所有表都是由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的主键时遇到了麻烦。我很感激任何建议。感谢。
答案 0 :(得分:2)
那么,正在更新的表有哪些外键?听起来你不能改变department.id
的值,因为其他一些表的department_id
列指向department.id
时有一个外键约束。
这实际上是“一件好事”,因为这意味着您的数据是可靠的。
您需要更改更新语句,以便同时更新受影响的表的department_id
列以及department.id
(以及任何其他受影响的表),或者您可以选择{{} 1}}外键约束,以便更改级联。执行此操作的语法因数据库实现而异。
这实际上与JPA或Hibernate没有任何关系 - 它纯粹是数据库中声明的外键约束的结果(可能来自Hibernate映射并从Hibernate模式自动生成数据库模式)生成器工具,但现在无关紧要了。)