Hibernate:向关联列表添加新元素不会持久

pba*_*lls 5 hibernate-mapping

我有两个实体之间的多对多关联:COURSE 和 STUDENT。它们通过 STUDENT_COURSE_MAP 关联表关联。

课程.java:

@Entity
@Table(name="COURSE")
public class Course implements java.io.Serializable {
   @ManyToMany(
      mappedBy="courses",
      cascade={CascadeType.PERSIST, CascadeType.MERGE}
   )
   private List<Student> students = Collections.emptyList();

   // Rest of the class, getters, setters etc
}
Run Code Online (Sandbox Code Playgroud)

学生.java:

@Entity
@Table(name="STUDENT")
public class Student implements java.io.Serializable {
   @ManyToMany(
      targetEntity=Course.class,
      cascade = { CascadeType.PERSIST, CascadeType.MERGE }
   )
   @JoinTable(
      name="STUDENT_COURSE_MAP",
      joinColumns=@JoinColumn(name="STUDENT_REF"),
      inverseJoinColumns=@JoinColumn(name="COURSE_REF")
   )
   private Set<Course> courses = Collections.emptySet();

   // Rest of the class, getters, setters etc
}
Run Code Online (Sandbox Code Playgroud)

我想为一门特定课程 (id=77) 添加一个学生 (id=11) 列表,如下所示(交易已经开始):

// Create new list and add a student to it
Student student_11 = (Student) session.get(Student.class.getName(), 11);
List<Student> studentsList = new ArrayList<Student>(1);
studentsList.add(student_11);

// Now, set the list of students in the course
Course course_77 = (Course) session.get(Course.class.getName(), 77);
course_77.setStudents(studentsList);
Run Code Online (Sandbox Code Playgroud)

我使用以下代码保存它:

session.flush();
session.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)

但是,关联 - course_77 和 student_11 - 不会持久保存到数据库中。休眠日志中没有生成插入语句。

我什至尝试调用session.saveOrUpdate(course_77). saveOrUpdate调用时仅记录以下内容:

allowing proxied method [saveOrUpdate] to proceed to real session
persistent instance of: org.whatra.tradecog.db.entity.Artist
ignoring persistent instance
object already associated with session: [Course#77]
Run Code Online (Sandbox Code Playgroud)

非常感谢提示/技巧/解决方案。


注 1: 当我创建新的 Course 和 Student 对象并保存时,整个持久性对我来说都很好。当我检索现有的 Course 和现有的 Student 对象并在它们之间添加新的关联时,不起作用。

pba*_*lls 6

这是出了什么问题。事实证明,我只保存了协会的一侧。这是我应该做的:

// Create new list and add a student to it
Student student_11 = (Student)session.get(Student.class.getName(), 11);
Course course_77 = (Course) session.get(Course.class.getName(), 77);

List studentsList = new ArrayList(1);
studentsList.add(student_11);

Set coursesList = new HashSet(1);
coursesList.add(course_77);

course_77.setStudents(studentsList);
// THIS IS WHAT'S WRONG - I MISSED THIS NEXT LINE
student_11.setCourses(coursesList);
Run Code Online (Sandbox Code Playgroud)

我在http://en.wikibooks.org/wiki/Java_Persistence/Relationships(查看“常见问题”下)找到了答案。