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

时间:2011-10-13 07:07:13

标签: hibernate-mapping

我在两个实体之间有一个ManyToMany关联:COURSE和STUDENT。它们通过STUDENT_COURSE_MAP关联表关联。

Course.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
}

Student.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
}

我想为一个特定课程(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);

我使用以下代码保存:

session.flush();
session.getTransaction().commit();

但是,关联 - 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]

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


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

2 个答案:

答案 0 :(得分:4)

这是错的。事实证明我只保存了协会的一方。这就是我应该做的:

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

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

答案 1 :(得分:1)

我在下面的网站上为你的同一个问题做了很好的例子,希望你能解决你的问题

This link will be useful to you http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html