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

时间:2015-08-21 18:17:16

标签: 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>();

}

EmpDetails.java

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "EMP_ID")
    private Employee employee;
}

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

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

    session.beginTransaction();

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

    session.getTransaction().commit();
    session.close();

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

  

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

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

2 个答案:

答案 0 :(得分:5)

REMOVE级联类型用于标准JPA remove()操作。对于本机Hibernate delete()操作,您需要使用https://github.com/fiskeben/mcp3008.js

@Cascade(CascadeType.DELETE)

答案 1 :(得分:0)

当您在会话中删除Employee并尝试添加它时,我遇到了相同的问题:

session.delete(session.get(Employee.class, employee_Id));

在我的问题上,我与电影和时间表的关系是OneToOne:

在电影模型上:

public class Movie implements Serializable
{
   @Id
   @Column(name = "fid")
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int fid;
   ....
    @OneToOne(mappedBy = "movie", cascade = CascadeType.ALL, orphanRemoval = true)
    private TimeTable timetable;
}

在时间表模型上:

public class TimeTable implements Serializable 
{
   ...
    @OneToOne
    @JoinColumn(name = "fid")
    private Movie movie;
}