【问题标题】:detached entity passed to persist Kotlin分离的实体传递给 Kotlin
【发布时间】:2018-03-06 18:37:18
【问题描述】:

当我尝试持久化实体时,出现以下错误

org.hibernate.PersistentObjectException:分离的实体传递给 坚持:xxxxxxx.xxxxxxxx.发票

我的模型

@Entity
@Table(name = "invoices")
class Invoice(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long = -1,
        var date: Date,
        @Column(name = "user_id", unique = true)
        var userId: Long,
        @Column(name = "invoice_number")
        var invoiceNumber: String) : Serializable {

    constructor(date: Date, userId: Long, invoiceNumber: String) : this(-1, date, userId, invoiceNumber)
}

发票对象的创建如下

val invoice = Invoice(Date(), 11111, "abc123")

invoiceDao.create(invoice)

在我的通用 dao 中我坚持

fun create(entity: T): T {
    entityManager.persist(entity)

    return entity
}

allopennoarg 包含在我的 build.gradle 中

【问题讨论】:

  • 您的 id 属性是否有默认值?这可能是问题所在。
  • 您已将 id 字段定义为自动生成,但为其分配了默认值。当 hibernate 尝试持久化它时,它认为该对象代表数据库中的底层行,因为它已经有一个 id。因此,它认为它是一个分离的对象。
  • 如何在 Kotlin 中做到这一点?将 null 设置为 id?
  • 我还没有完成 Kotlin。我想只要你不分配任何东西,它就会被认为是 null。
  • @Sashi 设置 var id: Long? = null 现在可以使用。请发布答案,以便我可以接受您的:D

标签: hibernate jpa kotlin


【解决方案1】:

您已将 id 字段定义为自动生成,但为其分配了默认值。当 hibernate 尝试持久化它时,它认为该对象代表数据库中的底层行,因为它已经有一个 id。因此,它认为它是一个分离的对象。 persist() 方法不适用于分离的对象。 您可以将 id 的默认值设置为 null 来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2011-09-16
    • 2015-04-22
    • 2021-07-18
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多