java - 重写 Kotlin 的属性 setter 会导致两个 JPA @Id

标签 java hibernate jpa kotlin

我有三个代表 Hibernate 实体的 Kotlin 类:

@MappedSuperclass
abstract class Parent {
    @Id @GeneratedValue @Column(nullable=false)
    var id: Long? = null
}

@Entity
class Child1 {}

@Entity
class Child2 {
    @Id @GeneratedValue @Column(nullable=false)
    override var id: Long? = null
        set(value) {
            super.id = value
            doSomething()
        }
}

注意,我需要重写 id 的 setter 以便之后调用 doSomething 。这就是我之前在Java中完成id的方式。

它构建正确,但 Hibernate 不喜欢它:

A foreign key refering Child2 from ... has the wrong number of column. Should be 2.

由于其他一些错误,我怀疑覆盖的 id 未正确覆盖,并且 Hibernate 两次看到 id 列 - 来自 ParentChild2.

最佳答案

我无意中找到了解决方案:

override var id: Long?
    get() = super.id
    set(value) {
        super.id = value
        doSomething()
    }

诀窍是:

  1. 未给字段赋值
  2. 创建一个链接到super的 getter

这样 Kotlin 就不会在实体上创建新字段,而只会覆盖 getter/setter。

关于java - 重写 Kotlin 的属性 setter 会导致两个 JPA @Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985070/

相关文章:

java - 向导生成的 JPA DAO 方法不返回可迭代列表

java - JPA 2.1 表示属性 "indexes is undefined"

java - 如何使用 gmail OAuth 验证 IMAP?

java - 了解 Android 应用程序中的内存泄漏

java - 尝试使用 java/android 从 url 流获取元数据时出错

当jpa创建实体时,使用JPA对elasticsearch进行 hibernate 搜索无法自动创建索引

java - 外键未存储在子实体中(一对多)

java - LibGDX resize window - 缩放字体

java - 使用 spring mvc 和 hibernate 在 jsp 上显示图像

jpa - 将 EmbeddedId 与 Ebean 的 ManyToOne 映射结合使用时出现重复列