我正在研究测试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: 无法删除或更新父行:外键约束失败
有人可以帮我解决如何在这里测试级联删除选项吗?
答案 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;
}