如何使用 Hibernate 和 @WhereJoinTable 保持多对多关系?
How do I persist a many-to-many relationship using Hibernate with @WhereJoinTable?
我在课程和用户之间有一个多对多的关系,由角色定义如下:
用户根据三个角色之一与课程相关联:
- 学生 (1)
- 标记 (2)
- 讲师 (3)
在我的数据模型中,我有一个 User
table 和一个 Course
table,以及一个 USERS_COURSES
table。 USERS_COURSES
是一个标准的多对多连接 table,带有一个通过整数映射到上述枚举值的额外列。
在我的休眠实体 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: 字段 'ROLE' 没有默认值
您可以使用 @SQLInsert
为关联指定自定义 sql 插入语句 table:
@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;
}
我在课程和用户之间有一个多对多的关系,由角色定义如下:
用户根据三个角色之一与课程相关联:
- 学生 (1)
- 标记 (2)
- 讲师 (3)
在我的数据模型中,我有一个 User
table 和一个 Course
table,以及一个 USERS_COURSES
table。 USERS_COURSES
是一个标准的多对多连接 table,带有一个通过整数映射到上述枚举值的额外列。
在我的休眠实体 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: 字段 'ROLE' 没有默认值
您可以使用 @SQLInsert
为关联指定自定义 sql 插入语句 table:
@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;
}