【问题标题】:Not able to Delete a record from Parent table having child records even after having Cascade All enabled即使启用 Cascade All 后,也无法从具有子记录的父表中删除记录
【发布时间】:2018-10-19 10:02:40
【问题描述】:

我有一个表 Department ,其中包含一对多映射到 Employee 表并具有级联类型。

@OneToMany(mappedBy="department",orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @Fetch(FetchMode.JOIN)
    private List<Employee> emp; 

在数据库中,子表(员工)在外键上有这个约束


当我在 Java 代码中从部门表中删除记录时,使用带有主键作为参数的 Hibernate *Delete 函数,*它是从部门表中删除记录以及在员工表中删除与其相关的所有记录。 当我在查询下运行时(Dep_ref 不是primaryKey)

delete from Department where Dep_ref= 99999;

所以它应该删除Department表中的所有记录,以及Employee表中的相关记录。 但是,我遇到了错误。

SQL 错误:ORA-02292:违反完整性约束 - 子记录 成立 02292. 00000 - “违反完整性约束 (%s.%s) - 找到子记录” *原因:试图删除具有外来的父键值 依赖。 *操作:先删除依赖项,然后删除父项或禁用约束。

谁能帮我解决这个问题。

【问题讨论】:

  • 尝试初始化您的 emp 集合:private List&lt;Employee&gt; emp = new ArrayList&lt;&gt;(); 并确保在您删除 Department 时获取它(因为它是惰性的)。

标签: java sql hibernate spring-boot cascading-deletes


【解决方案1】:

映射中的问题。这是错误的方向。您应该在 Employee 上创建外键来引用 Department。

// Departments
@OneToMany(mappedBy="departments", cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Set<Employee> emp;

// Employee
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="department_id" , referencedColumnName="id", insertable=false, updatable=false)
private Departments department;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多