我正在使用Crud存储库删除功能在循环中删除对象。我的对象有关系也应该用它删除(orphanRemoval)+ cascadeType = ALL。 但我注意到第一次迭代正确地删除了对象的关系,这个sql看起来:
Hibernate:
delete
from
base_interval_last_modifications
where
base_interval_id=?
Hibernate:
delete
from
visit
where
id=?
Hibernate:
delete
from
last_modification
where
id=?
Hibernate:
delete
from
base_interval
where
id=?
第二次迭代产生这个sql语句:
Hibernate:
delete
from
visit
where
id=?
有人可以解释一下,如果相同类型的对象上的相同函数生成另一个语句并且实际上没有正确删除所有关系,可能会如何?
更新“更多代码”: 在第一个循环中,baseInterval被正确删除,而workInterval是不变的,但在第二个循环中,只删除了没有baseInterval的访问。
@Entity
class Visit(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int? = null,
@OneToOne(cascade = [CascadeType.ALL], orphanRemoval = true)
@JoinColumn
var baseInterval: BaseInterval? = null,
)
@Entity
class BaseInterval(
id: Int? = null,
@OneToOne(mappedBy = "baseInterval")
var visit: Visit? = null,
@ManyToOne
@JsonIgnore
var workInterval: WorkInterval? = null
)
循环
futureVisits
.forEach {
visitRepository.delete(it)
}