2

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

UPDATE Department SET id=100000 WHERE id=0;

不幸的是,这会导致错误

错误 1451 (23000):无法删除或更新父行:外键约束失败(departmentuserlink,CONSTRAINT FK96AF44EAB09C41C5 FOREIGN KEY (department_id) REFERENCES department (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 的主键时遇到了麻烦。我会很感激任何建议。谢谢。

4

1 回答 1

2

那么,正在更新的表有哪些外键?听起来您无法更改 的值,因为其他一些表在其指向department.id的列上有外键约束。department_iddepartment.id

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

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

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

于 2010-07-22T20:52:56.623 回答