【发布时间】:2019-03-11 17:22:01
【问题描述】:
我的 Postgres 数据库中有一个表,它有一个时间戳列。我希望每次更新一行时都会自动插入它。我写了一个数据库触发器:
CREATE FUNCTION update_last_edit_date() RETURNS trigger AS $update_last_edit_date$
BEGIN
NEW.last_edit_date := localtimestamp(0);
RETURN NEW;
END;
$update_last_edit_date$ LANGUAGE plpgsql;
CREATE TRIGGER update_last_edit_date BEFORE UPDATE ON employee
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE update_last_edit_date();
这很好,但我想知道是否有更简单的方法可以使用 jpa/hibernate 注释来做到这一点。我尝试了这些不同的选项:
@Preupdate
@PreUpdate
private void onUpdate(){
this.lastEditDate = new Date();
}
@UpdateTimestamp
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date lastEditDate;
但是我得到的是,当我更新一行时,所有行的时间戳都更新了,所以表中的所有时间戳总是相同的。我在这里做错了什么?
【问题讨论】:
-
任何 JPA 注释将只适用于一行……一个对象……根据定义。如果您更新了所有行,那么这特定于您数据库中的其他内容,并且超出了 JPA 的范围。 JPA 日志告诉您 IT 正在做什么。
标签: java postgresql hibernate jpa timestamp