2016-12-25 4 views
0

У меня есть два предмета Курсы и курсUser. Курсы сопоставлены с аннотацией OneToMany к CourseUser. После того, как я добавлю CourseUser в список CourseUsers in Course и обновляю его, в таблице CourseUser появится новая строка, но она не отображается на курсы. Если я вызову toString из списка курсоров из курсов после обновления, он будет пустым.Hibernate 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

В во-первых, вы должны сохранить объект, который является ref с помощью 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.