我想从两个表创建一个关联表。 我们称他们为学生和课程。两者都有一个id和一个唯一的名字 我想要的是第三个表(student_id到course_id),当我插入一个参加课程的学生时,它会自动更新。
我发现here: Hibernate Many-to-Many with Annotations几乎是以下示例,但我将@Table注释更改为
@Table(name = "STUDENT",
uniqueConstraints = {@UniqueConstraint(columnNames = {"STUDENT_NAME" })})
课程也一样。
我插入了第一个学生
Set<Course> courses = new HashSet<Course>();
courses.add("Math); courses.add("Science");
Student alice = new Student("alice", courses);
这是另一名学生
Student bob= new Student("bob", courses);
因为课程科学和数学已经存在于课程中而且崩溃了,而且student_to_course表将不会更新。
我所知道的是在课程表中查询具有此名称的课程。如果有一个我将它添加到学生课程,否则添加一个新的。
List<Course> list = session.createCriteria(Course.class)
.add(Restrictions.eq("courseName", "Maths")).list();
if (list.size() > 0){
courses.add(list.get(0));
}
else {
courses.add(new Course("Maths"));
}
s.setCourses(courses);
所以这有效,但我认为必须有更好的方法来做到这一点 有没有办法告诉hibernate如果表中已经有一个同名的课程,可以从课程表中向学生添加课程?
答案 0 :(得分:0)
你正确地做到了,没有别的办法。
除了这种情况不太现实。大多数情况下,可用课程列表是事先知道的,您只能在创建学生时选择可用的课程。用户界面通常会提出一个多选框,您必须选择课程,而不是使用他们的名字来引用所选课程,而是使用他们的ID(或直接使用课程实体)。
因此该方法如下所示:
public Student createStudent(String studentName, Set<Long> courseIds)
或者像这样:
public Student createStudent(String studentName, Set<Course> courses)
在第一种情况下,获得一套课程的最简单,最快捷的方法是循环课程ID并调用session.load(courseId)
以获得对课程的引用,甚至不需要访问数据库。 / p>