尝试找到一种更语义化的方式在 Kotlin 中编写 Spring 实体

Eer*_*ist 5 spring nullable spring-data-jpa kotlin semantics

我有一个用 Kotlin 编写的 Spring 实体:

@Entity
class Book(
    @Id
    var id: Long? = null,
    var title: String? = null, // cannot actually be null, immutable
    var isInStock: Boolean? = null, // cannot actually be null
    var description: String? = null,
 )
Run Code Online (Sandbox Code Playgroud)

所有字段都必须可为空,因为 Spring 需要初始化空对象。

但是,这使得实体的使用变得复杂,因为我总是必须将可为空的类型转换为其不可为空的等效类型。这不是语义:我想真正了解哪些字段实际上可以为空,哪些字段不能(或者只能null在初始化过程中)。

此外,某些字段是可变的,但有些字段在创建实体后不应更改。最好使用 Kotlinvalvar做出这种区分。

所以,我想与以下课程一起工作:

class BetterBook(
    val id: Long,
    val title: String,
    var isInStock: Boolean,
    var description: String? = null,
 )
Run Code Online (Sandbox Code Playgroud)

这样就很清楚哪些字段是可变的,哪些字段可以null

我考虑过创建一个包装器Book。有人有过类似的想法吗?这在架构上是一个好的解决方案吗?

Yon*_*bbs 3

val实际上,您可以完全按照您想要的方式进行操作:使用而不是不可变属性定义类var,为它们提供不可为空的类型,并且没有默认构造函数。当设置数据库中的值时,Spring 使用反射来获取由 Kotlin 代码生成的(只读)属性底层的成员变量。对于默认构造函数(它在运行时确实需要),有一个kotlin-jpa 插件会在编译的代码中自动为您生成它。因此,基本上保持您的代码完全按照您惯用的方式编写(就像您对 所做的那样BetterBook),并使用 注释该类@Entity,但请确保应用该插件。