合并实体时,@ CreatedDate / @ LastModifiedDate设置为null

时间:2019-08-19 06:12:53

标签: spring hibernate kotlin spring-data-jpa

我正在尝试使用Spring的@CreatedDate@LastModifiedDate向我的实体添加可审核性。我在Spring Boot中使用Hibernate。

它适用于插入,但是在通过重用ID更新实体时遇到问题。

这是我的实体类:

@Entity
class Serie(
    val name: String,
    val url: URL
) {
  @Id
  @GeneratedValue
  var id: Long = 0

  @CreatedDate
  @Column(updatable = false, nullable = false)
  var createdDate: LocalDateTime? = null

  @LastModifiedDate
  @Column(nullable = false)
  var modifiedDate: LocalDateTime? = null

在我的代码中,这些实体来自磁盘扫描,因此当我执行定期扫描时,新扫描的对象(尚未持久)可以处于3种不同的状态:

  1. 不存在,在这种情况下,我需要删除数据库中的对象
  2. 尚不存在,在这种情况下,我需要在数据库中插入对象
  3. DB中已经存在,在这种情况下,我需要更新对象

我遇到的问题是第三个(更新),我通过找到对象的ID(使用唯一的URL字段)并将其设置在尚未持久的对象上,然后保存(使用Spring JPA存储库):

serieRepository.findByUrl(newSerie.url)?.let { existingSerie ->
          newSerie.id = existingSerie.id
}
serieRepository.save(newSerie)

为我自己的字段(name,以及为清晰起见而省略的其他对象)更新对象是可行的,但是在更新之后,将字段createdDatemodifiedDate设置为null

我不确定像这样重用ID是否是一个好习惯,但是这有助于在代码中包含不可变的实体。我想我可以改为使用setter更新数据库中已有的对象,但这将迫使我将实体的所有字段从val更改为var

您知道是否可以使用这种更新策略来获得这些创建和上次修改时间?

0 个答案:

没有答案