使用唯一列自动更新多对多表

时间:2012-01-07 14:17:16

标签: java hibernate many-to-many

当我写这个问题时,我想出了一个解决方案,但无论如何我都会问。也许有更容易的方法。

我想从两个表创建一个关联表。 我们称他们为学生和课程。两者都有一个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如果表中已经有一个同名的课程,可以从课程表中向学生添加课程?

1 个答案:

答案 0 :(得分:0)

你正确地做到了,没有别的办法。

除了这种情况不太现实。大多数情况下,可用课程列表是事先知道的,您只能在创建学生时选择可用的课程。用户界面通常会提出一个多选框,您必须选择课程,而不是使用他们的名字来引用所选课程,而是使用他们的ID(或直接使用课程实体)。

因此该方法如下所示:

public Student createStudent(String studentName, Set<Long> courseIds)

或者像这样:

public Student createStudent(String studentName, Set<Course> courses)

在第一种情况下,获得一套课程的最简单,最快捷的方法是循环课程ID并调用session.load(courseId)以获得对课程的引用,甚至不需要访问数据库。 / p>