Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Hibernate 删除具有多对多关系的对象实例而不进行级联失败_Hibernate_Spring_Spring Roo - Fatal编程技术网

Hibernate 删除具有多对多关系的对象实例而不进行级联失败

Hibernate 删除具有多对多关系的对象实例而不进行级联失败,hibernate,spring,spring-roo,Hibernate,Spring,Spring Roo,我有两个班(学生和课程),它们有着多对多的关系。 它们的实例可以在没有其他实例的情况下存在。 因此,我删除了JPA注释中的cascade属性:@ManyToMany(cascade=CascadeType.ALL) 一旦我尝试删除一名学生,我就会收到此错误消息 我做错了什么? org.hibernate.exception.ConstraintViolationException:无法 删除:[com.Student#4];嵌套异常是 javax.persistence.PersistenceE

我有两个班(学生和课程),它们有着多对多的关系。 它们的实例可以在没有其他实例的情况下存在。 因此,我删除了JPA注释中的cascade属性:@ManyToMany(cascade=CascadeType.ALL)

一旦我尝试删除一名学生,我就会收到此错误消息

我做错了什么?

org.hibernate.exception.ConstraintViolationException:无法 删除:[com.Student#4];嵌套异常是 javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException:无法 删除:[com.Student#4]

这是Hibernate输出:

休眠:从id=?和版本=?2011-09-19 15:25:10317[http-8080-3]错误 org.hibernate.util.jdbceptionReporter-无法删除或更新 父行:外键约束失败 (
数据库
学生课程
,约束FKF8A06F72970A31AF 键(
students
)引用
students
id

这是两个类别的相关部分:

@RooJavaBean
@RooToString
@RooEntity
public class Student{

    @ManyToMany
    private Set<Course> courses= new HashSet<Course>();
}

@RooJavaBean
@RooToString
@RooEntity
public class Course {

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students= new HashSet<Student>();
}
@RooJavaBean
@生根
@RooEntity
公立班学生{
@许多
私有集课程=新HashSet();
}
@爪哇豆
@生根
@RooEntity
公共课{
@许多(mappedBy=“courses”)
private Set students=new HashSet();
}

我打算建议在
学生
中添加一个
detachFromCourses()
方法,该方法迭代
课程
,删除
。您可以在删除
学生之前调用它。但这太难看了,而且它不太适合SpringRoo

我是否可以建议创建一个连接到
@PreRemove
JPA事件的链接?然后,您可以使您的域模型和控制器不受数据库特定内容的影响。然后,您的实体侦听器可以执行以下操作:

@PreRemove
void onPreRemove(Object o) {
    if (o instanceof Student) {
        // Remove all the course references to this Student
        Student s = (Student) o;
        for (Course c : s.getCourses()) {
            c.getStudents().remove(s);
        }
    }
}

你的意图是什么?如果您要删除
学生
,您肯定希望更新所有
课程中的
集合
,对吗?尝试恢复级联,但使用
CascadeType.REMOVE
删除学生之前,是否可以尝试清除课程集合。我不认为cascade在这里会有帮助-cascade是用于在删除学生时删除课程。在您的情况下,导致问题的是映射表中的行。