我有两个实体之间的多对多关联: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 对象并在它们之间添加新的关联时,不起作用。
这是出了什么问题。事实证明,我只保存了协会的一侧。这是我应该做的:
// 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(查看“常见问题”下)找到了答案。
| 归档时间: |
|
| 查看次数: |
9332 次 |
| 最近记录: |