gpt4 book ai didi

java - 可更新的虚假行为不一致

转载 作者:行者123 更新时间:2023-11-29 09:25:20 25 4
gpt4 key购买 nike

每当记录更新时,我需要 SYSDATE 更新 LastUpdatedDttm。但是下面的注释不能按预期工作。 SYSDATE 仅被插入一次并且不会为后续更新而更新。另外,lastUpdDTTM 不是 hibernate 生成的 sql 的一部分。

@Generated(GenerationTime.ALWAYS)
@Column(name="LAST_UPDATED_DTTM",insertable=false,updatable=true, columnDefinition ="timestamp default SYSDATE")
private Date lastUpdDTTM;

@Generated(GenerationTime.ALWAYS)
@Column(name="CREATED_DTTM", insertable=false, updatable=false)
private Date createdDTTM;

最佳答案

(...) SYSDATE is inserted only once and not updated for subsequent updates.

首先要明确一点:Generated的意思是这个字段是由数据库生成的,Hibernate需要在insert/update之后读取它来更新实体。在列定义中使用 default SYSDATE 适用于 INSERT,但对于 UPDATE,您需要一个触发器。

Also, lastUpdDTTM is not part of sql generated by hibernate.

好吧,你告诉 Hibernate 该字段 ALWAYS 由数据库生成,所以我对 Hibernate 不将它包含在生成的 SQL 中并不感到惊讶(实际上,我相信这在某种程度上是冲突的使用 udpatable = true,我希望 Hibernate 会提示它)。

无论如何,正如我所说,更新此字段的不是 Hibernate,而是数据库,您需要一个触发器,Hibernate 将在更新后刷新实体以获取新值。


另一种方法是使用回调注释,例如最后更新日期:

@PreUpdate
protected void updateDates() {
lastUpdDTTM = new Date();
}

为了更好的一致性,您甚至可以使用与 @PrePersit 相同的创建日期方法:

@PrePersist
@PreUpdate
protected void updateDates() {
Date now = new Date();
if (createdDTTM == null) {
createdDTTM = new Date(now.getTime());
}
lastUpdDTTM = now;
}

关于java - 可更新的虚假行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2780230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com