@CreationTimestamp和@UpdateTimestamp在Kotlin中不起作用

这是我的标记和发布实体类:

@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 = 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 = 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(标记和post): 在这里输入图像说明

我将这个代码转换为Java,它工作正常

Kotlin版本:1.2-M2

springBootVersion:’2.0.0.M7′

问题可能存在于这些注释不限于他们应该注释的事实。 这意味着kotlin不知道把它们放在最后的字节码中。

为了得到与java生成的字节码相同的字节码,你需要指定有问题的注释的注解目标:

 @field:CreationTimestamp lateinit var createDate: Date 

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

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

到目前为止,我最好的猜测是,你正在使用Spring Data JPA,而@CreationTimestamp@UpdateTimestamp是Hibernate特有的。