在Hibernate中使用带有mappdBy的级联

9udxz4iz  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(146)

我有两个班级的老师和课程。教师可以有多门课程。我想要使用除移除之外的所有级联。

public Teacher {

    @OneToMany(mappedBy = "teacher",cascade = {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.DETACH,CascadeType.MERGE})
    private List<Course> courses;
}
public class Course {
    ....
    @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH,CascadeType.REFRESH})
    @JoinColumn(name="teacher_id")
    private Teacher teacher;
}

然后创建对象以将它们保存在另一个主类中。

List<Course> l = new ArrayList<>();
    l.add(course1);
    l.add(course2);
    teacher.setCourses(l);

    SessionFactory sf = new Configuration().configure().addAnnotatedClass(Teacher.class).
    addAnnotatedClass(Course.class).buildSessionFactory();
    Session session = sf.getCurrentSession();

    try {
        session.beginTransaction();
        session.save(teacher);
        session.getTransaction().commit();

但这并不能挽救课程。好吧,也许mappdby的东西不是自动保存的,我应该写ession.save(课程),但如果它不自动做任何事情,为什么我要在Teacher中写级联类型?

pinkon5k

pinkon5k1#

您已指定双向关系,但仅向教师添加课程。您的课程实体没有教师,因此需要在保留教师之前添加。

List<Course> l = new ArrayList<>();
l.add(course1);
l.add(course2);
teacher.setCourses(l);

course1.setTeacher(teacher)
course2.setTeacher(teacher)

在上面的关系中,你可以把老师想象成父母,把课程想象成孩子。在这种情况下,建议仅在父级和子级之间级联,因此删除课程实体中的级联。这样你总能知道瀑布往哪个方向走

public class Course {
    ....
    @ManyToOne
    @JoinColumn(name="teacher_id")
    private Teacher teacher;
}

相关问题