【问题标题】:Why @UpdateTimestamp is setting a value by default on entity creation?为什么@UpdateTimestamp 在实体创建时默认设置一个值?
【发布时间】:2021-06-08 23:13:51
【问题描述】:

我有一个实体,其中包含一个字段来保存实体更新的日期。我正在使用以下注释:

@Temporal(TemporalType.TIMESTAMP)
@UpdateTimestamp
@Column(name = "updated_at", nullable = true)
private Date updatedAt;

我希望 null 中的 updatedAt 作为默认值,但我的默认值与创建实体的日期相同。

在我的@Service 类中,我像这样保存实体:

visitorRepository.saveAndFlush(visitor)

有没有一种方法可以使用@UpdateTimestamp 将我的updatedAt 保存为null 作为默认值?

【问题讨论】:

  • 深入检查文档,但我 99% 确定这是不可能的。当您保存时,实际上它是一种更新。例如,如果您有 2 列:一列用于更新时间戳,另一列用于插入时间戳,当您保存对象并且之后没有更新时,两者将具有相同的值,
  • 正是发生了什么,createdAtupdatedAt 在实体创建后具有相同的值。 createdAt@CreationTimestamp 注释。
  • @UpdateTimestamp 使用GenerationTiming.ALWAYS,因此始终会生成一个值(INSERT 或 UPDATE)。不确定是否可行,但不妨试试@Column(... insertable = false)
  • 不是坏行为。如果两列中的值相同(插入和更新时间戳),则表示用户没有编辑任何内容(是的,这很明显)。通常,插入时间戳被标记为不可更新。所以,你有一个简单的审计方法,¿你为什么需要更新字段为空?这是我的帮助
  • 我需要返回未更新的对象列表,然后我认为可以通过该字段进行访问。同时,我将删除注释并手动处理日期。

标签: java spring-boot hibernate annotations audit


【解决方案1】:

正如Andrew S 建议的in a comment 一样,@UpdateTimestamp@Column(... insertable = false) 的组合对我起到了作用。

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多