使用 Kotlin 进行 JPA 审计

Posted

技术标签:

【中文标题】使用 Kotlin 进行 JPA 审计【英文标题】:JPA Auditing with Kotlin 【发布时间】:2019-12-18 12:39:25 【问题描述】:

我想在 kotlin 数据类中使用 @CreatedDate 注释。所有属性都应初始化为不可变(val)。问题是,该实现无法处理不可变变量。不会设置正确的日期并且变量为空。使用可变变量,实现可以设置日期。

例子:

    @Entity
    @EntityListeners(AuditingEntityListener::class)
    data class Test(

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "id", updatable = false, nullable = false)
    val id: UUID? = null,

    val text: String,
    @CreatedDate
    @Column(updatable = false, nullable = false)
    var createdAt: LocalDateTime?,
    ...

kotlin 编译器有什么特殊的插件可以解决这个问题还是可以在同一个数据类中使用 val 和 var?

【问题讨论】:

当然可以。为什么你觉得不合适? 如果您只想将其设置为创建时刻,则不需要特殊注释:@Column(updatable = false, nullable = false) val createdAt: LocalDateTime = LocalDateTime.now() 我也先使用了这个显式初始化,前段时间有人告诉我用@CreatedDate注解替换它。我尝试了很多次,但我想知道您如何保存您的实体,因为每次我都遇到错误No value passed for parameter 'createdAt' 【参考方案1】:

使用valvar 是完全可以接受的。

考虑一个示例,您只希望在实例化对象时能够设置属性,但不希望用户以后能够更改这些属性。

这就像允许在构造函数中赋值,然后只为该属性提供一个 getter 方法。

如果您显示实际的字节码(将 kotlin 转换为 java 等价物),您会看到这一点。 val 属性没有设置方法。

Intellij 使用说明:

Display bytecode: Tools -> Kotlin -> Show Kotlin Bytecode
Or just: cmd + shift + A (Mac) / ctrl + shift + A (Windows) and type “Kotlin Bytecode”

【讨论】:

以上是关于使用 Kotlin 进行 JPA 审计的主要内容,如果未能解决你的问题,请参考以下文章

使用 kotlin 插件 jpa 构建配置失败

审计对 JPA 实体的访问

如何使用Spring Data JPA完成审计功能

如何使用Spring Data JPA完成审计功能

在 Kotlin 中使用 Jpa 注释从基类继承父属性

kotlin-jpa 插件不生成默认构造函数