2 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
有很多方法可以實(shí)現(xiàn)這一目標(biāo)。
@實(shí)體監(jiān)聽器
你可以有一個(gè)@Embeddable來存儲審計(jì)屬性:
@Embeddable
public class Audit {
@Column(name = "created_on")
private LocalDateTime createdOn;
@Column(name = "updated_on")
private LocalDateTime updatedOn;
//Getters and setters omitted for brevity
}
這需要一個(gè)EntityListener如下所示的:
public class AuditListener {
@PrePersist
public void setCreatedOn(Auditable auditable) {
Audit audit = auditable.getAudit();
if(audit == null) {
audit = new Audit();
auditable.setAudit(audit);
}
audit.setCreatedOn(LocalDateTime.now());
}
@PreUpdate
public void setUpdatedOn(Auditable auditable) {
Audit audit = auditable.getAudit();
audit.setUpdatedOn(LocalDateTime.now());
}
}
您的實(shí)體必須實(shí)現(xiàn)該Audit接口:
public interface Auditable {
Audit getAudit();
void setAudit(Audit audit);
}
實(shí)體將如下所示:
@Entity(name = "Tag")
@Table(name = "tag")
@EntityListeners(AuditListener.class)
public class Tag implements Auditable {
@Id
private String name;
@Embedded
private Audit audit;
//Getters and setters omitted for brevity
}
這是一個(gè)非常優(yōu)雅的解決方案,因?yàn)樗鼜闹鲗?shí)體映射中提取審計(jì)邏輯。
@PrePersist 和 @PreUpdate
您也可以使用@PrePersist和@PreUpdateJPA 注釋:
@Embeddable
public class Audit {
@Column(name = "created_on")
private LocalDateTime createdOn;
@Column(name = "updated_on")
private LocalDateTime updatedOn;
@PrePersist
public void prePersist() {
createdOn = LocalDateTime.now();
}
@PreUpdate
public void preUpdate() {
updatedOn = LocalDateTime.now();
}
//Getters and setters omitted for brevity
}
并將Auditembeddable添加到實(shí)體中,如下所示:
@Entity(name = "Tag")
@Table(name = "tag")
public class Tag {
@Id
private String name;
@Embedded
private Audit audit = new Audit();
//Getters and setters omitted for brevity
}
特定于 Hibernate 的@CreationTimestamp和@UpdateTimestamp
@CreationTimestamp
@Column(name = "created_on")
private Date createdOn;
@Column(name = "updated_on")
@UpdateTimestamp
private Date updatedOn;
就是這樣!
現(xiàn)在,與您的評論有關(guān):
但是我得到的是,當(dāng)我更新一行時(shí),所有行的時(shí)間戳都會更新,因此表中的所有時(shí)間戳始終相同。我在這里做錯(cuò)了什么?
時(shí)間戳只會為被修改的實(shí)體更新,而不是為所有行更新。當(dāng)只有一行被修改時(shí),更新所有行的時(shí)間戳沒有任何意義。否則,為什么要在行本身上放置該列?
如果您想要上次修改時(shí)間戳,只需運(yùn)行如下查詢:
SELECT MAX(updated_on)
FROM tags
添加回答
舉報(bào)