【发布时间】:2018-05-31 07:42:47
【问题描述】:
我有一个支持 H2 和 SqlServer 的 Spring 应用程序。 我已经设置了实体列,例如:
@Column(insertable = false, columnDefinition = "bigint default CURRENT_TIMESTAMP")
现在,当我保存新实体时,时间戳设置正确。但是,当我修改实体时,时间戳将是我在对象更新前设置的任何内容。 我知道如果我设置 updatable = false 那么它将再次更新为 current_timestamp 但是我需要灵活性以便仅在有重大更改时才设置时间戳,即如果我更改我不想要的实体上的评论字段要更改的时间戳,但如果我更改所有者字段,我确实希望更新时间戳。
我已尝试将值设置为 null,但这无济于事。我不确定如何使用 @PreUpdate 方法从 db 获取 CURRENT_TIMESTAMP 以使用,我也不知道有任何方法可以轻松修改 crud.save()。我能想到的唯一选择是使用带有本机查询的@Modifying 添加customSave,但这是最后的手段。
注意:我必须使用数据库时间戳,准确性非常重要,行必须按顺序保存,时间戳递增,服务器时间漂移会引入竞争条件。
【问题讨论】:
-
如果您使用时间戳来影响某些顺序,我认为代理身份/序列主键可以很好地解决该问题,并且会自动进行 b-tree 索引,从而可以根据需要进行快速排序。正如我的回答所表明的那样,这允许时间戳行为基于业务需求,而不是试图改进同一领域的可能 2 个可能不相关的需求组。
标签: java spring hibernate spring-data-jpa