如何使用Hibernate与@WhereJoinTable保持多对多的关系?

时间:2016-03-23 17:32:39

标签: java hibernate many-to-many

我在角色定义的课程和用户之间存在多对多关系,如下所示:

用户根据以下三个角色之一与课程相关联:

  • 学生(1)
  • Marker(2)
  • 讲师(3)

在我的数据模型中,我有一个User表和一个Course表,以及一个USERS_COURSES表。 USERS_COURSES是一个标准的多对多连接表,其中一个额外的列通过整数映射到上面的枚举值。

在我的休眠实体Course中,我有一个方法getStudents(),定义为@ManyToMany@WhereJoinTable(clause = "ROLE = 1")。我可以通过这种方式获得一组学生,但是如果我想将学生添加到给定的课程中,我不能简单地将新用户添加到该集合并保留我的Course对象,因为角色列确实如此没有默认值。

当我持久化这个集合时,有没有办法可以为角色列指定一个值?

这是我的get / set方法供参考:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "USERS_COURSES",
        joinColumns = {@JoinColumn(name = "COURSE_ID")},
        inverseJoinColumns = {@JoinColumn(name = "USER_ID")})
@WhereJoinTable(clause = "ROLE = 1")
@SortComparator(User.FullNameComparator.class)
public SortedSet<User> getStudents() {
    return students;
}

public void setStudents(SortedSet<User> students) {
    this.students = students;
}

以下是我试图做的测试,但它失败了:

Course course = getCourse(1);
User user = UserDAO.getUser(2);
course.getStudents().add(user);
modifyCourse(course);

modifyCourse定义如下:

Transaction transaction = null;
try (Session session = HibernateUtil.getSession()) {
    transaction = session.beginTransaction();
    session.saveOrUpdate(course);
    transaction.commit();
    return course;
} catch (HibernateException e) {
    LOG.error(e.getMessage(), e);
    if (transaction != null) {
        transaction.rollback();
    }
    return null;
}

这是我得到的错误:

2016-03-23 14:43:04,894 [main] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1364, SQLState: HY000
2016-03-23 14:43:04,924 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Field 'ROLE' doesn't have a default value
2016-03-23 14:43:04,928 [main] ERROR org.hibernate.internal.SessionImpl - HHH000346: Error during managed flush [could not execute statement]
2016-03-23 14:43:04,972 [main] ERROR com.abopu.codedrop.db.dao.CourseDAO - could not execute statement

java.sql.SQLException:Field&#39; ROLE&#39;没有默认值

1 个答案:

答案 0 :(得分:3)

您可以使用@SQLInsert为关联表指定自定义sql insert语句:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "USERS_COURSES",
        joinColumns = {@JoinColumn(name = "COURSE_ID")},
        inverseJoinColumns = {@JoinColumn(name = "USER_ID")})
@WhereJoinTable(clause = "ROLE = 1")
@SQLInsert(sql = "insert into USERS_COURSES (COURSE_ID, USER_ID, ROLE) values (?, ?, 1)")
@SortComparator(User.FullNameComparator.class)
public SortedSet<User> getStudents() {
    return students;
}

Thisthis文章也很有帮助。