java—当我没有设置任何级联类型时,为什么默认情况下hibernate是级联的

balp4ylt  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(242)

当我试图持久化新文档时,遇到以下异常 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。
如果我替换 persistmerge 操作成功,但合并会导致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

}

ar5n3qh5

ar5n3qh51#

这是因为您试图持久化不存在的对象,所以应该首先使用cascadetype.persist或持久化swipeidkey对象

相关问题