java - 如何避免 Hibernate 为 OneToMany 的更新生成两个查询?

标签 java hibernate one-to-many hibernate-onetomany

我面临与 this question 相同的情况,这没有有用的答案。

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

为什么需要第二个查询?不是在插入中设置了父级的 id 吗?
有没有办法避免这种情况?

    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是拥有方(因为它是唯一的一方)。

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

关于java - 如何避免 Hibernate 为 OneToMany 的更新生成两个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35223952/

相关文章:

java - Hibernate - 如何在不加载到内存的情况下删除条件?

ios - 关于 "to-many"和谓词

java - Jhipster - 一对多关系,在客户端看不到集合

java - 单击按钮从 jtable 中删除选定的行

java - 矩阵的元素是内存地址而不是元素的值

hibernate - 更改枚举的默认 hibernate 映射策略

python - django prefetch_related 跨多个具有过滤条件的一对多关系

Java线程,我怎样才能让一个线程总是先停止或结束?

Java JFreeChart 未在 JPanel 中完全显示图表

java - 将 Hibernate Validator 与 JPA 和 Spring 结合使用