Hibernate throws无法删除或更新父行:外键约束失败

lea*_*ner 6 java mysql hibernate

我正在研究一个测试cascade delete操作的基本示例,但我得到了例外.

我有以下实体:

Employee.java

@Entity
public class Employee {
    @Id
    @Column(name = "EMP_ID")
    private long id;

    private String name;

    @OneToMany(mappedBy = "employee")
    @Cascade(value = { CascadeType.REMOVE, CascadeType.SAVE_UPDATE })
    private List<EmpDetails> details = new ArrayList<EmpDetails>();

}
Run Code Online (Sandbox Code Playgroud)

EmpDetails.java

@Entity
public class EmpDetails {
    @Id
    private long id;
    private int info;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "EMP_ID")
    private Employee employee;
}
Run Code Online (Sandbox Code Playgroud)

现在我在数据库中有员工ID为10的记录以及员工详细信息表中的相应记录.

现在当我运行以下查询时:

    session.beginTransaction();

    session.delete(new Employee(10)); // here 10 is the ID of the employee

    session.getTransaction().commit();
    session.close();
Run Code Online (Sandbox Code Playgroud)

我认为hibernate将删除员工记录和相应的员工详细信息记录,因为我已设置要删除的级联类型.但我得到例外:

引起:com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败

有人可以帮我在这里测试级联删除选项吗?

JB *_*zet 5

REMOVE级联类型用于标准JPA remove()操作.对于本机Hibernate delete()操作,您需要使用Hibernate专有的注释:

@Cascade(CascadeType.DELETE)
Run Code Online (Sandbox Code Playgroud)

  • 另一个问题是你要删除`new Employee(10)`.因此,这个新的员工在其列表中没有详细信息.使用`delete(session.get(Employee.class,10));` (2认同)