2016-12-25 73 views
0

我有兩個實體課程和CourseUser。使用OneToMany註釋映射到CourseUser的課程。在課程中的CourseUser列表中添加CourseUser並更新後,新表將出現在CourseUser表中,但它未映射到課程。如果我更新後從課程中調用toString用戶列表,它將是空的。休眠OneToMany關係不映射新數據

@Entity 
@Table(name = "COURSES") 
public class Courses{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "course_id") 
    private int course_id; 

    @Column(name = "course_name", nullable = false) 
    private String courseName; 

    @Autowired 
    @OneToMany(mappedBy = "course", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private Set<CourseUser> courseUsers = new HashSet<>(0); 

CourseUser實體:

@Entity 
@Table(name = "COURSE_USERS", 
    uniqueConstraints = {@UniqueConstraint(columnNames = {"course_name", "user_name"})}) 
public class CourseUser { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ev_id") 
    private int ev_id; 


    @Column(name = "course_name", nullable = false) 
    private String courseName; 

    @Column(name = "user_name", nullable = false) 
    private String userName; 

    @Column(name = "course_role") 
    private String courseRole; 

    @Column(name = "grade") 
    private int grade ; 

    @ManyToOne 
    @JoinColumn(name = "course_id") 
    private Courses course; 

這是我的新courseUser添加到課程:

Courses course = courseDAO.getCourse(id); 
Set<CourseUser> courseUsers = course.getCourseUsers(); 
CourseUser newUser = new CourseUser(); 
      newUser.setUserName(name); 
      newUser.setCourseRole(role); 
      newUser.setCourseName(course.getCourseName()); 
      courseUsers.add(newUser); 
      course.setCourseUsers(courseUsers); 
      update(course); 

,這裏是CoursesDAO更新方法:

public void update(Courses course) { 

     Session session = sf.openSession(); 
     Transaction transaction = session.beginTransaction(); 
     session.merge(course); 
     session.flush(); 
     transaction.commit(); 
     session.close(); 
    } 
+0

初始化'Set courseUsers = new HashSet <>(0)'是什麼目的? –

+0

我已經在本教程中完成了https://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ – Petych

回答

0

在首先,你必須保存實體,這是參考由id引發。 對於你的情況,你必須首先保存CourseUser,然後將它添加到Course

例如:

Courses course = courseDAO.getCourse(id); 
Set<CourseUser> courseUsers = course.getCourseUsers(); 
CourseUser newUser = new CourseUser(); 
newUser.setUserName(name); 
newUser.setCourseRole(role); 
newUser.setCourseName(course.getCourseName()); 
// this row is very important 
// after thus operation newUser will have an id to be referenced 
courseUserDto.save(newUser); 
courseUsers.add(newUser); 
course.setCourseUsers(courseUsers); 
update(course); 

此外,還有就是你寫了一些冗餘代碼:

Set<CourseUser> courseUsers = course.getCourseUsers(); 
// ... 
course.setCourseUsers(courseUsers); 

course已經存儲參考courseUsers