Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Hibernate和@WhereJoinTable保持多对多关系?_Java_Hibernate_Many To Many - Fatal编程技术网

Java 如何使用Hibernate和@WhereJoinTable保持多对多关系?

Java 如何使用Hibernate和@WhereJoinTable保持多对多关系?,java,hibernate,many-to-many,Java,Hibernate,Many To Many,我在课程和用户之间有一个多对多关系,由一个角色定义如下: Transaction transaction = null; try (Session session = HibernateUtil.getSession()) { transaction = session.beginTransaction(); session.saveOrUpdate(course); transaction.commit(); return course; } catch (Hi

我在课程和用户之间有一个多对多关系,由一个角色定义如下:

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;
}
用户根据以下三个角色之一与课程关联:

  • 学生(1)
  • 标记(2)
  • 讲师(3)
在我的数据模型中,我有一个
User
表和一个
Course
表,还有一个
USERS\u COURSES
USERS\u COURSES
是一个标准的多对多联接表,带有一个额外的列,通过整数映射到上述枚举值

在我的hibernate entity
课程中,我有一个方法
getStudents()
,它被定义为一个
@ManyToMany
,带有一个
@WhereJoinTable(子句=“ROLE=1”)
。我可以通过这种方式获得一组学生,但是如果我想向给定的课程添加一名学生,我不能简单地向该组添加一个新用户并持久化我的
课程
对象,因为角色列没有默认值

在持久化此集合时,是否有方法可以为角色列指定值

以下是我的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;
}
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”没有默认值

可用于为关联表指定自定义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;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“USERS\u COURSES”,
joinColumns={@JoinColumn(name=“COURSE_ID”)},
inverseJoinColumns={@JoinColumn(name=“USER\u ID”)})
@其中jointable(子句=“ROLE=1”)
@SQLInsert(sql=“insert into USERS\u COURSES(COURSE\u ID,USER\u ID,ROLE)值(?,1)”)
@SortComparator(User.FullNameComparator.class)
公共分类集getStudents(){
留学生;
}
文章也会有所帮助