在休眠状态下,我具有以下双向关系结构。我正在使用名为Grandparent
,Parent
和Child
的对象。正如人们所期望的,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}}列表。
可悲的是,单向关系(很容易解决此问题)不允许传播已删除的子对象,因此该对象不在图片之内。
有人能启发我这里发生的事情以及解决这个问题的最佳方法是什么吗?