我在两个实体之间有一个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对象并保存时,整个持久性对我来说很好。当我检索现有课程和现有学生对象并在它们之间添加新关联时,什么不起作用。
答案 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)
我在下面的网站上为你的同一个问题做了很好的例子,希望你能解决你的问题