2016-12-25 7 views
0

私は2つのエンティティコースとコースユーザーを持っています。 CourseUserにOneToMany注釈でマップされたコース。 CourseUserをCourse内のCourseUsersのリストに追加して更新すると、CourseUserテーブルに新しい行が表示されますが、コースにはマッピングされません。もし私が更新後にcourseUsersリストの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を追加する方法である:で

public void update(Courses course) { 

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

'を設定するのはどのようなのですか?courseUsers = new HashSet <>(0)'? –

+0

私はこのチュートリアルのようにしました。https://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ – Petych

答えて

0

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の更新方法でありますまず、エンティティを保存する必要があります。これはrefですidによって勃起した。 あなたの場合、最初にCourseUserを保存してから、Courseに追加する必要があります。例えば

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

courseをすでにcourseUsersへの参照を格納します。

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

また、あなたが書いたいくつかの冗長なコードがあります。

関連する問題