2016-03-23 9 views
1

I have a izler birçok çoğa bir Rolü tarafından tanımlanan Kurs ve kullanıcı arasındaki ilişki olarak:@WhereJoinTable ile Hibernate kullanarak çoktan çoğa ilişkiyi nasıl kalıcı hale getirebilirim?

Kullanıcılar üç rollerden birine dayanarak Kursu ile ilişkilidir:

  • Öğrenci (1)
  • İşaretleyici (2)
  • Öğretim benim veri modelinde (3)

, bir User masa vesahiptablosu ve USERS_COURSES tablosu. USERS_COURSES, yukarıda sayılan değerlere bir tam sayı ile eşlenen fazladan bir sütuna sahip, çoktan çoğa standart bir birleştirme tablosudur. Benim hazırda varlık Course yılında

, ben @WhereJoinTable(clause = "ROLE = 1") ile @ManyToMany olarak tanımlanan bir yöntem getStudents() var. Bir dizi öğrenciyi bu yolla iyice öğrenebilirim, ancak bir öğrenciye belirli bir kursu eklemek istersem, bu gruba yeni bir kullanıcı ekleyemiyorum ve Course nesnesini devam ettiremiyorum çünkü rol sütununda bir varsayılan yok değer.

Bu seti devam ettirdiğimde rol sütunu için bir değer belirleyebileceğim bir yol var mı?

İşte
@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; 
} 

Bir test olarak yapmaya çalıştığınızı şey bu, ama o da çöküyor:

İşte başvuru için benim get/set yöntemleri var aşağıdaki gibi

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

modifyCourse tanımlanır:

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; 
} 

Bu alıyorum hatadır:

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: Alan 'ROLÜ' varsayılan bir değeri yoktur

cevap

3

Sen dernek tablo için özel bir sql insert deyimi belirtmek için @SQLInsert kullanabilirsiniz:

@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; 
} 

This ve this makaleleri de yardımcı olabilir.