如何避免Hibernate使用OneToMany生成两个更新查询? [英] How to avoid Hibernate generating two queries for an update with OneToMany?

查看:221
本文介绍了如何避免Hibernate使用OneToMany生成两个更新查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我面临着与此问题相同的情况,没有有用的答案。

I'm facing the same situation as in this question, that has no useful answer.

当我将一个新元素添加到我的一对多关系的很多部分时,Hibernate会生成两个查询,一个插入,一个将外键更新到父项。

When I add a new element to the many part of my one-to-many relation, Hibernate generates two queries, one to insert and one to update the foreign key to the parent.

为什么需要第二个查询?插入中是否设置了父代的ID?
有没有办法避免这种情况?

Why does it need the second query for? Isn't the parent's id set in the insert? Is there any way of avoiding this?

    Hibernate:
        /* insert mydomain.LanguageKnowledge */
            insert
            into
                languageKnowledge
                (language_fk, level_fk, personId_fk)
            values
                (?, ?, ?)
    Hibernate:
        /* create one-to-many row mydomain.Person.offeredLanguages */
        update
            languageKnowledge
        set
            personId_fk=?
        where
            id=?



    public class LanguageKnowledge {

        @Id
        @GeneratedValue(strategy = IDENTITY)
        private Integer id;

        @Enumerated(STRING)
        @Column(name = "language_fk")
        private LanguageIso639_3 language;

        @Enumerated(STRING)
        @Column(name = "level_fk")
        private LanguageLevel level;

        protected LanguageKnowledge() {
        }
    }


    public class Person {

        @Id
        @GeneratedValue(strategy = IDENTITY)
        private Integer id;

        @OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true)
        @JoinColumn(name = "personId_fk", referencedColumnName = "id", nullable = false)
        private final Set<LanguageKnowledge> offeredLanguages = new HashSet<>();

        public Person(Set<LanguageKnowledge> offeredLanguages) {
            addOfferedLanguages(offeredLanguages);
        }

        protected Person() {
        }

        public void addOfferedLanguages(Set<LanguageKnowledge> offeredLanguages) {
            this.offeredLanguages.addAll(offeredLanguages);
        }

        public void removeOfferedLanguages(Set<LanguageKnowledge> offeredLanguagesToRemove) {
            this.offeredLanguages.removeAll(offeredLanguagesToRemove);
        }
    }


推荐答案

关联是单向的,所以 Person 是拥有者的一方(因为它是唯一的一方)。

The association is uni-directional, so Person is the owning side (because it's the only side).

关联双向并使 LanguageKnowledge 关联所有者。这样您将避免多余的更新,因为外键值将被指定为 LanguageKnowledge 的插入语句的一部分。

Make the association bidirectional and make LanguageKnowledge the association owner. That way you will avoid redundant updates because the foreign key values will be specified as part of insert statements for LanguageKnowledge.

这篇关于如何避免Hibernate使用OneToMany生成两个更新查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆