【问题标题】:@CreationTimestamp and @UpdateTimestamp don't work in Kotlin@CreationTimestamp 和 @UpdateTimestamp 在 Kotlin 中不起作用
【发布时间】:2023-03-29 04:30:01
【问题描述】:

这是我的 Tag 和 Post Entity 类:

@Entity
class Tag(
        @get:NotBlank
        @Column(unique = true)
        val name: String = "",
        val description: String = ""
) {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    val id: Int? = null


    @ManyToMany(mappedBy = "tags")
    val posts: MutableSet<Post> = mutableSetOf()

    @CreationTimestamp
    lateinit var createDate: Date

    @UpdateTimestamp
    lateinit var updateDate: Date

    fun addPost(post: Post) {
        this.posts.add(post)
        post.tags.add(this)
    }


}



@Entity
class Post(
        @get:NotBlank
        var name: String = "",
        val content: String = ""
) {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    val id: Int? = null
    @ManyToMany
    @Cascade(CascadeType.ALL)
    val tags: MutableSet<Tag> = mutableSetOf()

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    lateinit var createDate: Date

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    lateinit var updateDate: Date


    fun addTag(tag: Tag) {
        this.tags.add(tag)
        tag.posts.add(this)
    }
}

查询:

val post1 = Post( "Post 1", "Post 1 content");
val post2 = Post( "Post 2", "Post 2 content");
var tag = Tag( "news", "Tag description")
post1.addTag(tag)
post2.addTag(tag)
em.persist(post1)
em.persist(post2)
em.remove(post1)
em.flush()

但是,createDate 和 updateDate 返回 null(标签和帖子):

我将此代码转换为 Java 并且运行良好

Kotlin 版本:1.2-M2

springBootVersion: '2.0.0.M7'

【问题讨论】:

    标签: spring kotlin spring-data spring-data-jpa


    【解决方案1】:

    问题可能在于这些注释并不局限于它们应该注释的内容。这意味着 kotlin 不知道将它们放在最终字节码中的确切位置。

    要获得与 java 生成的相同字节码,您需要指定相关注解的注解目标:

    @field:CreationTimestamp
    lateinit var createDate: Date
    

    【讨论】:

    • 谢谢,它有效。我不知道为什么他们在春季参考文献中没有提到这些东西
    • @Snoob 为什么您希望在 Spring 参考文档中对 Kotlin 正确使用 Hibernate 注释进行描述?
    【解决方案2】:

    上下文不足以提供任何有意义的答案。

    您必须提供更多上下文,尤其是应用程序服务器及其版本,甚至是针对此特定用例的代码。首先,我建议首先检查相同的 Java 代码是否有效。

    到目前为止,我的最佳猜测是,您使用的是 Spring Data JPA,而 @CreationTimestamp@UpdateTimestamp 是特定于 Hibernate 的。

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2022-07-26
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多