gpt4 book ai didi

java - 当我没有设置任何 CascadeTypes 时,为什么默认情况下 hibernate 级联

转载 作者:行者123 更新时间:2023-12-02 13:40:38 25 4
gpt4 key购买 nike

当我试图坚持新的 swipe 时,我遇到了以下异常对象:javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: org.munch.database.models.bunch.Munch这是我正在执行的代码:

databaseExecutor.executeAndRollbackOnFailure { entityManager ->
munch.swipes.forEach {
if (it.swipeIdKey.munchId != null) {
entityManager.persist(it)
} else if (it.updated) {
entityManager.merge(it)
}
}
entityManager.transaction.commit()
}
我还在下面粘贴了我的实体以供引用。
entityManager.persist(it)调用时,会抛出上述错误。出于某种原因,试图坚持 OneToMany实体的一侧也不起作用。我已经确定 CascadeTypes两个数组都是空的,所以据我了解只有 Swipe我调用 entityManager.persist() on 应该写入数据库。
如果我替换 persistmerge操作成功,但合并导致 hibernate 生成额外的 select对于 Munch还有一个 select对于 Swipe这是不必要的操作。然而,合并似乎没有将更新操作级联到 Munch。它只执行 2 个选择语句和 1 个插入。
回顾一下:
Hibernate 似乎在级联 Persist在不应该的时候进行操作。一个解决方案是使用 merge而是使用 persist应该只导致 1 insert其中 merge结果 2 selects + 1 insert除了执行本地查询以插入/更新之外,我没有其他想法,但如果可能的话,我想避免这种情况。
这是我的实体: Munch

@Entity
@TypeDefs(
TypeDef(
name = "list-array",
typeClass = ListArrayType::class
)
)
data class Munch(
@Column
val name: String,
@OneToMany(
fetch = FetchType.LAZY,
mappedBy = "munch",
)
val swipes: MutableList<Swipe> = mutableListOf(),
) {
@Id
@GenericGenerator(name = "generator", strategy = "uuid")
@GeneratedValue(generator = "generator")
lateinit var munchId: String

fun addSwipe(swipe: Swipe) {
swipes.add(swipe)
swipe.munch = this
}
}
Swipe
@Entity
data class Swipe(
@EmbeddedId
val swipeIdKey: SwipeIdKey,
@Column(nullable = true)
val liked: Boolean,
) : Serializable {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "munchId")
@MapsId("munchId")
lateinit var munch: Munch

@Transient
var updated = false
SwipeIdKey
@Embeddable
class SwipeIdKey : Serializable {

@Column(nullable = false)
lateinit var restaurantId: String

@Column(nullable = true)
lateinit var userId: String

@Column(nullable = true)
var munchId: String? = null
}

最佳答案

发生这种情况是因为您试图持久化不存在的对象,因此您应该首先使用 CascadeType.PERSIST 或持久化 SwipeIdKey 对象

关于java - 当我没有设置任何 CascadeTypes 时,为什么默认情况下 hibernate 级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63769468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com