【问题标题】:Why do I need to persist the owning side of relationship?为什么我需要坚持关系的拥有方?
【发布时间】:2022-01-26 06:50:35
【问题描述】:

考虑这段代码:这是来自 Repository 类,我已经用 @Transactional 正确注释了类。

public void addSubjectsToStudents(int studentId, List<Subject> subjects) {

    // 1. retrieve subject
    Student student = findById(studentId);

    // 2. add students
    subjects.forEach(subject -> {

        // 2.1 subjects are new -> so first persist them
        em.persist(subject);

        // 2.1 add student to subject
        subject.addStudent(student);

        // 2.2 add subject to student
        // must do both 2.1 and 2.2 because ManyToMany relationship
        student.addSubject(subject);
    });

    // this is newly added line here: why do I need to persist student ?
    // now persist the owning side
    em.persist(student);
}

现在,当我在没有最后一行的情况下运行代码时,测试工作正常,没有任何错误。但在数据库方面,没有任何更新。

然后我查看了教程,发现我必须坚持拥有方......

现在为什么会这样?我正在从数据库中检索学生(拥有方),因此它由 EntityManager 跟踪(我已将 @PersistenceContext 添加到 em)

因此我只需要预先保留新添加的主题。此时:科目和学生都将由 EntityManager 自动管理。所以我不需要再坚持任何事情了。

但是在这件事上我的想法似乎是错误的。这只发生在 @ManyToMany 关系中。在其他类型中,没有出现此问题。

我在这里缺少什么?我研究过类似的问题,但没有人解释原因。

为简洁起见,我省略了其他代码。如果您需要存储库和实体的这些代码,请随时请求。但是,我已经按照教程添加了所有内容,除此之外,其他案例都已成功通过。

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    在一般情况下,两个实体类之间的@ManyToMany 关系将使用三个 SQL 表在后台实现。这两个实体中的每一个都有自己的表,并且还有第三个联结表,它将一个实体的主键映射到另一个实体的主键。正是因为有了这个联结表,Java 中的两个实体之间才需要存在对象对对象的关系。这允许 Hibernate/JPA 确定需要在联结表中插入哪个元组。

    【讨论】:

    • 我已经为这两个实体添加了#JoinTable 和#JoinColumns。 hibernate 不应该知道,当它最初开始跟踪 Student 实体时,它必须更新另一个表?我不明白
    • 我明白你的疑惑。我没有比我上面发布的更好的答案了。 Hibernate 似乎将 2 向关系定义为……2 向关系。也就是说,两个实体必须相互指向才能正常工作。
    • 我认为您的回答可能不正确。我已经尝试过相反的方法,即使我坚持双方的关系,它也没有奏效。我这里加了,请看:stackoverflow.com/questions/70494629/…
    • @ahrooran ...我看到了那个问题,代码有很多问题。我 100% 确定,如果您正确设置关系的双方,它会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多