Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate无法删除或更新父行:外键约束失败_Java_Mysql_Hibernate - Fatal编程技术网

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: 无法删除或更新父行:外键约束失败


有人能帮我测试一下这里的级联删除选项吗?

删除级联类型用于标准JPA
REMOVE()
操作。对于本机Hibernate
delete()
操作,您需要使用:


当您在会话中删除员工并尝试添加此内容时,我遇到了相同的问题:

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;
}