当我试图持久化新文档时,遇到以下异常 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写入db。
如果我替换 persist
与 merge
操作成功,但合并会导致hibernate生成额外的 select
对于 Munch
同时也是一个 select
对于 Swipe
这些都是不必要的操作。不过,合并似乎并没有将更新操作级联到 Munch
它只执行2个select语句和1个insert语句。
概括地说: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 = 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
}
1条答案
按热度按时间ar5n3qh51#
这是因为您试图持久化不存在的对象,所以应该首先使用cascadetype.persist或持久化swipeidkey对象