使用Hibernate时,我的对象状态不一致
我的班级学校有一个学生集合
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "LINK_SCH_STUDENT", joinColumns = @JoinColumn(name = "SCHOOL_ID"),
inverseJoinColumns = @JoinColumn(name = "STUDENT_ID"))
@LazyCollection(LazyCollectionOption.EXTRA)
private List<Students> associatedStudents;
我有一个将学生与学校联系起来的交易方法:
@Transactional
LinkStudentToSchool (schoolId, StudendID){
flush();
int result = getSession().createSQLQuery("INSERT INTO " + getSchemaName()
+ ".LINK_SCH_STUDENT(SCHOOL_ID, STUDENT_ID) " +
"Values (:recipient_group_id, :contentId)")
}
我正在为这种方法编写集成测试。
@Transactional
TestLinkStudentToSchool {
school =new School ("GeorgiaTech", ....)
schoolId = saveOrUpdate (school)
studentID = saveOrUpdate (new Student ("LazyStudent", ....))
LinkStudentToSchool (schoolId, studentID)
Hibernate.initialize (school.getAssociatedStudent);
school.getAssociatedStudent // RETURN NULL !!!
}
为什么会发生这种情况,我已经调用了一种交易方法来为学生添加学校(更新链接表),但是学生收集的状态 在学校没有得到更新!!
这是一个缓存问题吗?是因为我嵌套了@transactional? 我将非常感谢任何反馈
由于
答案 0 :(得分:0)
首先创建一个Scool实例并保存它。它与Hibernate会话相关联。此时,学生列表为空,因为您忽略了将列表初始化为空列表(这应该是新学校的默认状态)。
然后执行SQL查询,就像Hibernate不存在而你使用JDBC一样。 Hibernate不知道这个查询的作用。它不知道查询是否在连接表中插入了一行。并且它不能神奇地知道这对应于学生和学校之间的新关联。它无法在内存中神奇地初始化学校的字段,并将其替换为包含学生的列表。不要使用SQL查询绕过Hibernate。使用实体:
// correct default state of a school:
private List<Students> associatedStudents = new ArrayList<>();
...
School school = new School("GeorgiaTech", ....);
session.save(school);
Student student = new Student("LazyStudent", ....);
session.save(student);
// now associate the student with the school:
school.getAssociatedStudents().add(student);
// done. Hibernate will insert the row in the association table for you.