Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 让JPA/Hibernate复制;“删除时设置为空”;功能_Java_Hibernate_Jpa - Fatal编程技术网

Java 让JPA/Hibernate复制;“删除时设置为空”;功能

Java 让JPA/Hibernate复制;“删除时设置为空”;功能,java,hibernate,jpa,Java,Hibernate,Jpa,我已经能够让JPA/Hibernate成功地复制关于删除级联的功能(似乎是默认行为),但我现在正试图复制关于删除集空的功能,我面临着一些问题 这是我的两门课: @Entity @Table(name = "teacher") public class Teacher { @Id @GeneratedValue @Column(name = "id", nullable = false, length = 4) private int id; @OneTo

我已经能够让JPA/Hibernate成功地复制关于删除级联的
功能(似乎是默认行为),但我现在正试图复制关于删除集空的
功能,我面临着一些问题

这是我的两门课:

@Entity
@Table(name = "teacher")
public class Teacher
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @OneToMany(mappedBy = "teacher")
    private List<Student> studentList;

    // ...
}
尝试删除教师时,出现以下错误:

org.springframework.dao.DataIntegrityViolationException:无法执行JDBC批更新;SQL[从教师中删除,其中教师id=?];约束[null]

原因:org.hibernate.exception.ConstraintViolationException:无法执行JDBC批更新

原因:java.sql.BatchUpdateException:批处理条目0从教师中删除,其中教师\u id='1'被中止。调用getNextException查看原因

我做错什么了吗?这是可以实现的吗


谢谢。

使用jpa/hibernate目前似乎不可能

JBs解决方案看起来很干净:

for (Department child : parent.getChildren()) {
    child.setParentDepartment(null);
}
session.delete(parent);
您还应该能够将其放入预删除:

@PreRemove
private void preRemove() {
    for (Student s : studentList) {
        s.setTeacher(null);
    }
}
如何定义

@ForeignKey(name = "fk_student_teacher",
            foreignKeyDefinition = " /*FOREIGN KEY in sql that sets ON DELETE SET NULL*/")

我认为最好的解决方案是使用用户SQL语句设置删除操作,如下所示:

CREATE TABLE table_name
(
  column1 datatype null/not null,
  column2 datatype null/not null,
  ...

  CONSTRAINT fk_column
     FOREIGN KEY (column1, column2, ... column_n)
     REFERENCES parent_table (column1, column2, ... column_n)
     ON DELETE SET NULL
);

当用户通过其他级联删除(您使用表引用此已删除行)删除行时,您无法使用hibernate解决方案并返回SQL异常。

是否要将该记录的所有列设置为空?或者学生实体的所有字段我希望
学生的
教师的
列在
学生的
教师的
从系统中删除后变为
null
。这并不是说你想更改JPA的模式,但我很好奇将其更改为在联接表上进行级联删除的多线程的效果。它应该删除关联并离开学生。谢谢你,两种解决方案都非常有效。我个人更喜欢第二个:)PreRemove解决方案不可移植。参见JPA规范第3.5节。一般来说,可移植应用程序的生命周期方法不应[…]修改同一持久性上下文中的关系,但是,当我从“教师”中删除“学生”并想将同一个“学生”添加到不同的“教师”中时,这根本不起作用-“学生”在数据库中的“教师”为空。这仅用于在模式生成生效时在关联数据库中指定外键约束。
CREATE TABLE table_name
(
  column1 datatype null/not null,
  column2 datatype null/not null,
  ...

  CONSTRAINT fk_column
     FOREIGN KEY (column1, column2, ... column_n)
     REFERENCES parent_table (column1, column2, ... column_n)
     ON DELETE SET NULL
);