我有2个课程,一个Room课程和一个Student课程。一个房间可以有很多学生,而学生也可以有很多房间。因此我使用了@ManyToMany关系
public class Room {
@ManyToMany
private Collection<Student> studentList = new ArrayList<Student>();
}
public class Student {
@ManyToMany(mappedBy="studentList")
private Collection<Room> roomList = new ArrayList<Room>();
}
由于我想使用1个Room_Student的映射表,我能够将一组学生添加到一个房间。当我试图向学生添加集合时,hibernate没有保存它。 这是
Collection<Student> collectionOfStudents=new ArrayList<Student>();
Room room1=(Room) session.get(Room.class, 1);
Student student1=(Student) session.get(Student.class, 1);
Student student2=(Student) session.get(Student.class, 2);
collectionOfStudents.add(student1);
collectionOfStudents.add(student2);
room1.getStudentList().addAll(collectionOfStudents)
session.update(room1);
这工作并插入表Room_Student
当我做的时候
Collection<Room> collectionOfRooms=new ArrayList<Room>();
Student student1=(Student) session.get(Student.class, 1);
Room room2=(Room) session.get(Room.class, 2);
Room room3=(Room) session.get(Room.class, 3);
collectionOfRooms.add(room2);
collectionOfRooms.add(room3);
student1.getRoomList().addAll(collectionOfRooms);
session.update(student1);
对于room2和room3, 未插入表Room_Student。
感谢所有回复
编辑1: 我添加了
public class Student {
@ManyToMany(mappedBy="studentList",cascade={CascadeType.ALL})
private Collection<Room> roomList = new ArrayList<Room>();
}
此
student1.getRoomList().addAll(collectionOfRooms);
session.update(student1);
未将房间更新/插入表格
答案 0 :(得分:4)
在您的映射中,Room
是拥有方,Student
是拥有方。所以你总是要把学生添加到一个房间,以便在房间和学生之间建立关系。即使您使用级联,以相反的方式执行也不起作用。您将始终必须在ORM中的关系中定义拥有方,并始终使用该方自身来创建关系。这link进一步阐明了这一主题。此外,如果您需要深入了解,您应该浏览JPA / hibernate文档。
答案 1 :(得分:0)
感谢Satadru,Hibernate并没有坚持其他方式,因此我必须删除映射( mappedBy ),并且两者都
Student_Room 表 和 Room_Student 表 将被创建。这表明房间拥有学生和学生拥有房间 而不是 Student_Room
然而,OJB很好地运用了这个功能。