【问题标题】:Unconsistent entity object collection state实体对象集合状态不一致
【发布时间】:2014-01-30 18:06:20
【问题描述】:

我在使用 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 吗? 我将非常感谢任何反馈

谢谢

【问题讨论】:

    标签: java mysql sql hibernate transactions


    【解决方案1】:

    您首先创建一个 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.
    

    【讨论】:

    • 感谢JB的回复。我没有对 Link 表使用 Hibernate 的唯一原因是它有一个用于软删除关联的“已删除”字段。使用 SQL 查询更容易直接设置字段。我知道我现在是否应该改变设计。
    • Hibernate 根本不会关心这个额外的列。如果你想让它关心它,那么连接表必须映射为一个实体,列应该映射为这个实体的一个字段。
    • 理解,谢谢让-巴蒂斯特。
    猜你喜欢
    • 2012-03-06
    • 2020-11-26
    • 1970-01-01
    • 2014-10-22
    • 2014-11-30
    • 2021-04-10
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多