当前位置: 首页 > 面试题库 >

让JPA / Hibernate复制“ ON DELETE SET NULL”功能

齐阳
2023-03-14
问题内容

我已经能够让JPA / Hibernate ON DELETE CASCADE成功复制功能(似乎是默认行为),但是我现在正在尝试复制ON DELETE SET NULL功能,并且遇到了问题。

这是我的两节课:

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

    // ...
}
@Entity
@Table(name = "student")
public class Student
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @ManyToOne(optional = true)
    @JoinColumn(name = "teacher_id", nullable = true)
    private Teacher teacher;

    // ...
}

当我尝试删除老师时,出现以下错误:

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

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

原因:java.sql.BatchUpdateException:批处理条目0从教师中删除,教师_id
=‘1’被中止。调用getNextException以查看原因。

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

谢谢。


问题答案:

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

JBs解决方案似乎很干净:

for (Department child : parent.getChildren()) {
    child.setParentDepartment(null);
}
session.delete(parent);

您还应该能够将其放入PreRemove中:

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


 类似资料:
  • 问题内容: 在JPA中,有什么方法可以复制Hibernate的saveOrUpdate行为, 它实质上检查数据库中是否已存在该对象,并根据需要更新该对象或保存该对象的新实例。 JPA无事务读取很不错,但是Hibernate确实缺少这种方法。有经验的JPA开发人员如何处理此问题? 问题答案: 尝试使用该方法-这非常相似。 Xebia的博客文章中对差异有一个很好的描述:“ JPA实施模式:保存(独立)

  • 我在实体之间有一对多的关系。执行此JPQL查询时: 从父项选择父项加入父项。孩子在哪里。。。 当一位家长有两个孩子时,我会得到重复的记录,当一位家长有一个孩子时,我只会得到一条记录,当没有孩子时,我会得到一条记录(如果没有孩子,我就没有记录)。请注意,SQL数据库中没有重复的父数据库。 实体声明如下: 为了简洁起见,我省略了很多代码,但这应该会让你对我要做的事情有一个清晰的认识。请注意,关系是在父

  • 用户详细信息 有人能看出我做错了什么吗?

  • 问题内容: 我想在数据库中复制实体集合。我使用以下方法检索该集合: 现在,我想复制“类别”列表,并使用EntityManager保留它。我正在使用JPA /hibernate。 更新 在知道如何分离我的实体之后,我需要知道要分离什么:当前代码: 这引发了异常。 我认为他想重新加载类别,因为我已经将它们分离了。我现在该怎么办? 问题答案: 亚伦·迪吉拉(AaronDiguila)的答案是去这里的方式

  • 问题内容: 我想以一种可为我的系统恢复的方式重命名PostgreSQL(9.6)表(使用JPA / Hibernate的Java应用程序) 在我的Java代码中,JPA实体将具有以下注释 ,数据库将具有名为的等效表。 我想将表重命名为,以便可以逐步更新数据库和Java应用程序,从而允许失败和回滚。 典型的步骤是 创建in的副本 确保两种读/写都可用(即,两种方式都复制了数据) 更新Java应用程序

  • 问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身