Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免Hibernate为OneToMany的更新生成两个查询?_Java_Hibernate_One To Many_Hibernate Onetomany - Fatal编程技术网

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

Java 如何避免Hibernate为OneToMany的更新生成两个查询?,java,hibernate,one-to-many,hibernate-onetomany,Java,Hibernate,One To Many,Hibernate Onetomany,我面临着与中相同的情况,这没有有用的答案 当我向一对多关系的多部分添加新元素时,Hibernate会生成两个查询,一个用于插入,另一个用于将外键更新到父项 为什么它需要第二个查询?家长的id不是在插入中设置的吗? 有没有办法避免这种情况 Hibernate: /* insert mydomain.LanguageKnowledge */ insert into languageKnowledg

我面临着与中相同的情况,这没有有用的答案

当我向一对多关系的多部分添加新元素时,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);
        }
    }
休眠:
/*插入mydomain.LanguageKnowledge*/
插入
进入
语言知识
(语言、级别、拟人)
价值观
(?, ?, ?)
冬眠:
/*创建一到多行mydomain.Person.offeredLanguages*/
更新
语言知识
设置
personId_fk=?
哪里
id=?
公共课语言知识{
@身份证
@生成值(策略=标识)
私有整数id;
@枚举(字符串)
@列(name=“language\u fk”)
专用语言ISO639_3语言;
@枚举(字符串)
@列(name=“level\u fk”)
私人语言水平;
受保护语言知识(){
}
}
公共阶层人士{
@身份证
@生成值(策略=标识)
私有整数id;
@OneToMany(fetch=EAGER,cascade={ALL},orphanRemoving=true)
@JoinColumn(name=“personId\u fk”,referencedColumnName=“id”,nullable=false)
private final Set offeredLanguages=新HashSet();
公众人士(提供的一套语言){
添加提供的语言(提供的语言);
}
受保护人(){
}
public void addOfferedLanguages(设置offeredLanguages){
this.offeredLanguages.addAll(offeredLanguages);
}
public void removeOfferedLanguages(设置OfferedLanguagesStoreMove){
this.offeredLanguages.removeAll(offeredLanguagesToRemove);
}
}

关联是单向的,因此
个人
是拥有方(因为它是唯一的一方)


使关联双向并使
LanguageKnowledge
成为关联所有者。这样可以避免冗余更新,因为外键值将被指定为
LanguageKnowledge

要避免的查询的insert语句的一部分?两者似乎都很有用……@JordiCastilla第二个,更新。编辑了我的问题。谢谢你的回答,但是你能不能说,为什么它要更新?因为当我看到日志时,在child
Insert
query中,它已经添加了外键。因此,它只是更新相同值的现有fk(冗余操作)。