我应该使用 Kotlin 数据类作为 JPA 实体吗?

Jan*_*ngo 12 hibernate jpa kotlin

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

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

@ManyToOne(fetch = FetchType.LAZY, optional = true)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jan*_*ngo 13

这个 Spring 官方指南表明我们不应该将 kotlin 数据类与 spring-data-jpa 一起使用。

他们说什么:

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


Mr.*_*tle 8

没错:Kotlin 数据类默认是不可变的,但这不应该阻止您使用延迟获取。

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

plugins {
  ...
  kotlin("plugin.allopen") version "1.3.61"
}

allOpen {
  annotation("javax.persistence.Entity")
  annotation("javax.persistence.Embeddable")
  annotation("javax.persistence.MappedSuperclass")
}
Run Code Online (Sandbox Code Playgroud)

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

  • 你确定你的答案吗?Kotlin 文档说“数据类不能是抽象的、开放的、密封的或内部的” https://kotlinlang.org/docs/reference/data-classes.html (2认同)

Pau*_*son 7

另一个不使用数据类的原因:JPA 实体可以形成一个类层次结构。数据类不能是open,即不能有子类。

(这是我发现的关于在 Kotlin 中使用 JPA+Hibernate的最佳指南。)