Hibernate使用@ManyToMany并更新两种方式

时间:2012-08-04 22:38:21

标签: java hibernate annotations

我有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);

未将房间更新/插入表格

2 个答案:

答案 0 :(得分:4)

在您的映射中,Room是拥有方,Student是拥有方。所以你总是要把学生添加到一个房间,以便在房间和学生之间建立关系。即使您使用级联,以相反的方式执行也不起作用。您将始终必须在ORM中的关系中定义拥有方,并始终使用该方自身来创建关系。这link进一步阐明了这一主题。此外,如果您需要深入了解,您应该浏览JPA / hibernate文档。

答案 1 :(得分:0)

感谢Satadru,Hibernate并没有坚持其他方式,因此我必须删除映射( mappedBy ),并且两者都

Student_Room 表 和 Room_Student 表 将被创建。这表明房间拥有学生和学生拥有房间 而不是 Student_Room

然而,OJB很好地运用了这个功能。