Java Hibernate无法删除或更新父行:外键约束失败
我正在编写一个基本示例来测试Java Hibernate无法删除或更新父行:外键约束失败,java,mysql,hibernate,Java,Mysql,Hibernate,我正在编写一个基本示例来测试级联删除操作,但我遇到了异常 我有以下实体: Employee.java @Entity public class Employee { @Id @Column(name = "EMP_ID") private long id; private String name; @OneToMany(mappedBy = "employee") @Cascade(value = { CascadeType.REMOVE, C
级联删除操作,但我遇到了异常
我有以下实体:
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>();
}
@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会删除员工记录和相应的员工详细信息记录,因为我已经将级联类型设置为remove。但我得到的例外是:
原因:
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:
无法删除或更新父行:外键约束失败
有人能帮我测试一下这里的级联删除选项吗?删除级联类型用于标准JPAREMOVE()
操作。对于本机Hibernatedelete()
操作,您需要使用:
当您在会话中删除员工并尝试添加此内容时,我遇到了相同的问题:
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;
}
嗨,JB,我尝试了删除选项,但仍然得到相同的错误。我在代码中使用hibernate注释来实现级联相关。我的日志显示它不是从EmpDetails表中删除,而是从Employee表中删除。另一个问题是您正在删除新员工(10)
。因此,该新员工的名单中没有详细信息。使用delete(session.get(Employee.class,10))
Hi JB,你能看一下我在Hibernate上的帖子吗?Hi@jbnize你在评论中提到的解决方案(不是在答案中)对我有效,但是我无法理解你答案的这一部分:“这个新员工因此在其列表中没有详细信息”。你能简单地解释一下吗?你使用哪个Hibernate版本?我刚刚在5.3.1.Final中尝试了这一点,但它没有删除引用的项,并且由于违反了foreignKey约束而失败。我的设计有父类和子类,并且有问题的集合来自我的孩子正在扩展的父类。
public class TimeTable implements Serializable
{
...
@OneToOne
@JoinColumn(name = "fid")
private Movie movie;
}