我正在尝试使用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种不同的状态:
我遇到的问题是第三个(更新),我通过找到对象的ID(使用唯一的URL字段)并将其设置在尚未持久的对象上,然后保存(使用Spring JPA存储库):
serieRepository.findByUrl(newSerie.url)?.let { existingSerie ->
newSerie.id = existingSerie.id
}
serieRepository.save(newSerie)
为我自己的字段(name
,以及为清晰起见而省略的其他对象)更新对象是可行的,但是在更新之后,将字段createdDate
和modifiedDate
设置为null
。
我不确定像这样重用ID是否是一个好习惯,但是这有助于在代码中包含不可变的实体。我想我可以改为使用setter更新数据库中已有的对象,但这将迫使我将实体的所有字段从val
更改为var
。
您知道是否可以使用这种更新策略来获得这些创建和上次修改时间?