【问题标题】:JPA update list of one to many relationshipJPA更新一对多关系列表
【发布时间】:2016-01-03 23:10:32
【问题描述】:

我有一个 Question 实体,其中包含另一个名为 Alternatives 的实体列表,如下所示:

public class Question {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL)
    @JsonManagedReference
    private List<Alternative> alternativeList;
}

public class Alternative implements Serializable {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "questionId", nullable = false)
    @JsonBackReference
    private Question question;

}

然后我想用一组新的替代列表更新现有的问题条目。为此,我使用新的 Question 对象调用 JpaDao 元素的合并方法:

@Repository
public class JpaQuestionDao implements QuestionDao {
    @PersistenceContext
    private EntityManager em;

    @Transactional
    public Question update(Question question) {
        return em.merge(question);
    }
}

然而,这实际上是在合并两个列表:一个已经在数据库中,另一个是新提供的。当我有非列表对象时,我对这种方法没有任何问题,这就是我一直使用合并方法的原因。

有没有不合并而只更新列表的替代方法?

【问题讨论】:

    标签: hibernate jpa merge entitymanager


    【解决方案1】:

    首先使用 EntityManager.find() 检索问题对象。问题对象将因此成为管理对象。由于alternativeList 是延迟加载的,因此您必须调用集合对象上的方法来获取它并使其成为托管对象。对 Question 对象和列表的任何更新都将自动发送到 DB。

    @Transactional
    public Question update(Question question) {
        Question q = em.find(Question.class, question.getId());
        q.setAlternativeList(null);
        q.setAlternativeList(question.getAlternativeList());
        ...
    
        return q;
    }
    

    或者,您可以尝试在您的 @OneToMany 集合上使用 orphanRemoval=true

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval=true)
    @JsonManagedReference
    private List<Alternative> alternativeList;
    

    【讨论】:

    • 这仍然是同样的问题:(我像这样设置 altList q.setAlternativeList(question.getAlternativeList());
    • 嗯,你到底想对列表做什么?我的意思是当你的列表内容到达数据库时,你对它有什么期望?
    • 例如,我在 DB 中有项目 1、2 和 3。然后我想调用 update 方法,在新的 Alternative 列表中传递一个新的 Question 对象,让我们假设 1,2 和 5(而不是 3)。而不是这个,我得到一个包含 1、2、3、1、2 和 5 的替代列表。
    • 试试更新的代码。我首先通过将列表设置为空来删除列表,然后更新列表。或者,您可以尝试 @OneToMany 注释中的 orphanRemoval 属性。
    • @Ish “对 Question 对象和列表的任何更新都将自动发送到 DB。” 错误,Question 是关联的反面。 orphanRemoval 将起作用(questionAlternative 中不可为空,所以我认为 OP 打算删除未使用的 Alternatives)。
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多