休眠状态,仅插入孙子项会更新祖父母->父项未更新

时间:2020-06-05 09:45:45

标签: hibernate kotlin parent-child cascade

在休眠状态下,我具有以下双向关系结构。我正在使用名为GrandparentParentChild的对象。正如人们所期望的,Grandparent有一个Parent列表,而iself有一个Child列表。 当我尝试插入新的Child时,就会出现问题,然后更改不会传播到parentRepository,但很有趣的是,更改传播到了grandparentRepository

请注意,我使用的是Kotlin,因此我们具有明确的Nullability。

@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 + ", " +
                    "}"
    }
}

我正在尝试像这样填充数据库

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))
    }
}

这只是意味着我先保存一个父对象,然后再保存具有其父属性集的相应子对象。 这样,我以后就有了一个填充的grandparentRepository,其中所有Grandparents都有Parents的列表,而那些Children的列表也有填充。 但是,在parentRepository中没有填充每个Children的{​​{1}}列表。

可悲的是,单向关系(很容易解决此问题)不允许传播已删除的子对象,因此该对象不在图片之内。

有人能启发我这里发生的事情以及解决这个问题的最佳方法是什么吗?

0 个答案:

没有答案
相关问题