【问题标题】:Cannot delete or update a parent row - JPA with Hibernate无法删除或更新父行 - 带有 Hibernate 的 JPA
【发布时间】:2010-07-22 20:47:11
【问题描述】:

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

UPDATE Department SET id=100000 WHERE id=0;

不幸的是,这会导致错误

ERROR 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 的主键时遇到了麻烦。我会很感激任何建议。谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 因此,从您所说的以及稍微查看 PhpMyAdmin 中的表来看,列注释中的 cascade=CascadeType.ALL 不会导致设置级联更新实际的表。您是否知道是否有一种方法可以通过 JPA 向表本身添加级联更新,或者我最好在需要时自己添加它们?感谢您的输入。我相信我对现在发生的事情有了更好的了解。
    • JPA 不会为您创建表。可能有一些工具可以基于根据您的 JPA 注释/休眠映射自动生成表定义,但使用 JPA 并不意味着为您处理表创建。 JPA 中的“级联”意味着不同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多