Java - 用于删除oneToMany关系的JPQL查询

时间:2011-04-15 10:07:30

标签: java orm jpa persistence jpql

如果我有这3个实体:

  

@Entity   公共班学生{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected Long id;

private String name; 
     

}

     

@Entity   @Inheritance(策略= InheritanceType.JOINED)   公共课程{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected Long id;

@OneToMany
private List<Student> students;

private String name; 
     

}

     

@Entity   @Inheritance(策略= InheritanceType.JOINED)   公共班组{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected Long id;

@OneToMany
private List<Student> students;

private String name; 
     

}

如何使用JPQL查询删除学生?

我试试

  

DELETE FROM Student's   WHERE s.name =“John Doe”

但我有

无法删除或更新父行:外键约束失败(database,CONSTRAINT FK_course_student_students_ID FOREIGN KEY(students_ID)参考studentID ))

我需要在纯JPQL中执行此操作以获得性能,我无法执行entity.remove,因为我有10000个John doe,我需要在一秒钟内删除它们。

为什么JPQL没有说:“嘿,让我们从这个生物学课程中删除这个john doe,他不存在”而不是“嘿,生物课程非常重要,没有学生可以从这门课程中删除! “

我缺少什么以及我必须使用哪种注释?

谢谢!

编辑:添加@JoinColumn到OnToMany关系可以工作,除非学生被不同的表引用...

2 个答案:

答案 0 :(得分:2)

默认情况下,通过连接表映射单向一对多关系。如果您对使用join talbe没有任何特殊要求,可以使用Student中的外键,它可以配置如下:

@OneToMany 
@JoinColumn
private List<Student> students; 

它也应该解决你的约束违规问题。

答案 1 :(得分:0)

有时您可以使用update all query清除对已删除对象的引用。

您还可以将数据库上的约束配置为在删除时级联或为null,以避免出现约束问题。