【问题标题】:Should I use Kotlin data class as JPA entity?我应该使用 Kotlin 数据类作为 JPA 实体吗?
【发布时间】:2019-09-27 03:16:12
【问题描述】:

我最近正在使用 Kotlin 和 JPA 进行开发。 我使用 Kotlin 数据类作为 JPA @Entity 类。

但是现在,关系出现了一些问题

@ManyToOne(fetch = FetchType.LAZY, optional = true)

延迟获取不适用于数据类。

我了解到 Kotlin 数据类默认为“最终”,因此 Hibernate 无法为它们生成代理。

我想知道将 Kotlin 数据类用作 JPA @Entity 类是一个错误,还是有其他方法可以使延迟获取与数据类一起正常工作。

【问题讨论】:

  • 我认为某个地方有 Kotlin 编译器插件可以使数据类对 JPA 可行,但据我所知,即使这样也不是一个好主意。所以我的答案是否定的。

标签: hibernate jpa kotlin


【解决方案1】:

This Spring official guides 表明我们不应该将 kotlin 数据类与 spring-data-jpa 一起使用。

他们在说什么:

这里我们不使用具有 val 属性的数据类,因为 JPA 不是为使用不可变类或数据类自动生成的方法而设计的。如果您使用的是其他 Spring Data 风格,它们中的大多数都旨在支持此类构造,因此您应该在使用 Spring Data MongoDB、Spring Data JDBC 等时使用 data class User(val login: String, ...​) 等类。

【讨论】:

    【解决方案2】:

    不使用数据类的另一个原因:JPA 实体可以形成class hierarchy。数据类不能为open,即不能有子类。

    (这是我找到的最好的guide on using JPA+Hibernate with Kotlin。)

    【讨论】:

      【解决方案3】:

      没错:Kotlin Data 类在默认情况下是不可变的,但这不应该阻止您使用惰性获取。

      为了使延迟获取按预期工作,实体应该是打开的。为此,您可以使用名为 Kotlin allopen 的插件:

      plugins {
        ...
        kotlin("plugin.allopen") version "1.3.61"
      }
      
      allOpen {
        annotation("javax.persistence.Entity")
        annotation("javax.persistence.Embeddable")
        annotation("javax.persistence.MappedSuperclass")
      }
      

      https://plugins.gradle.org/plugin/org.jetbrains.kotlin.plugin.allopen

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多