Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Hibernate 休眠,插入孙子只更新祖父母->;父级未更新_Hibernate_Kotlin_Parent Child_Cascade - Fatal编程技术网

Hibernate 休眠,插入孙子只更新祖父母->;父级未更新

Hibernate 休眠,插入孙子只更新祖父母->;父级未更新,hibernate,kotlin,parent-child,cascade,Hibernate,Kotlin,Parent Child,Cascade,我在hibernate中具有以下双向关系结构。我正在使用名为祖父母、父母和孩子的对象。正如人们所料,祖父母有一个父母的列表,而我自己有一个孩子的列表。 当我尝试插入一个新的子时,问题就出现了,然后更改不会传播到父存储库,但有趣的是,它会传播到祖父母存储库 请注意,我使用的是Kotlin,因此我们具有显式的可空性 @Entity(name = "grandparent") data class Grandparent( @Id @GeneratedValue(strategy =

我在hibernate中具有以下双向关系结构。我正在使用名为
祖父母
父母
孩子
的对象。正如人们所料,
祖父母
有一个
父母
的列表,而我自己有一个
孩子
的列表。 当我尝试插入一个新的
时,问题就出现了,然后更改不会传播到
父存储库
,但有趣的是,它会传播到
祖父母存储库

请注意,我使用的是Kotlin,因此我们具有显式的可空性

@Entity(name = "grandparent")
data class Grandparent(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    var id: Long = -1
    @NotNull var name: String,
    @OneToMany(
            cascade = [CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE],
            orphanRemoval = true,
            mappedBy = "factoryHall",
            fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @NotNull var parents: MutableList<Parent>,
) 

@Entity(name = "parent")
data class Parent(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    var id: Long = -1
    @ManyToOne(cascade = [CascadeType.MERGE],
            optional = true
    )
    @JoinColumn(name="grandparent_id")
    var grandparent: Grandparent? = null,
    @NotNull var name: String,
    @OneToMany(
            cascade = [CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE],
            orphanRemoval = true,
            mappedBy = "factoryHall",
            fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @NotNull var children: MutableList<Child>,
) {
    override fun toString(): String {
        return "{" +
                    "id: " + id + ", " +
                    "name: " + name + ", " +
                    "children: " + children.toString() + ", " +
                "}"
    }
}

@Entity(name = "child")
data class Child(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    var id: Long = -1
    @ManyToOne(cascade = [CascadeType.MERGE],
            optional = true
    )
    @JoinColumn(name="child_id")
    var Parent: Parent? = null,
    @NotNull var name: String,
) {
    override fun toString(): String {
            return "{" +
                        "id: " + id + ", " +
                        "name: " + name + ", " +
                    "}"
    }
}
这仅仅意味着我首先保存父对象,然后保存相应的子对象及其父属性集。 这样,我以后就有了一个填充的
祖父母存储库
,其中所有的
祖父母
都填充了
父母的列表
,而那些父母则填充了他们的
孩子的列表
。 但是,在
parentRepository
中,未填充每个
父项的
子项的列表

遗憾的是,单向关系(它很容易解决这个问题)不允许传播已删除的子对象,因此这一关系不存在

有谁能告诉我这里发生了什么,解决这个问题的最佳方法是什么

var savedGrandparent = grandparentRepository.save(grandparent)
for(parent in grandparent.parents){
    var savedParent = parentRepository.save(Parent(savedPlant, parent.name, parent.children))
    for(child in parent.children){
        childRepository.save(Child(savedParent, child.name))
    }
}