簡體   English   中英

如何使用Hibernate與@WhereJoinTable保持多對多的關系?

[英]How do I persist a many-to-many relationship using Hibernate with @WhereJoinTable?

我在一個角色定義的課程和用戶之間有多對多的關系,如下所示:

用戶基於以下三種角色之一與課程相關聯:

  • 學生(1)
  • 標記(2)
  • 講師(3)

在我的數據模型中,我有一個User表和一個Course表,以及一個USERS_COURSES表。 USERS_COURSES是一個標准的多對多連接表,其中一個額外的列通過整數映射到上面的枚舉值。

在我的hibernate實體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 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;
}

這篇這篇文章也很有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM