第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

更新 Hibernate 中每一行的時(shí)間戳

更新 Hibernate 中每一行的時(shí)間戳

縹緲止盈 2021-10-28 17:28:11
我的 Postgres 數(shù)據(jù)庫中有一個(gè)表,它有一個(gè)時(shí)間戳列。我希望每次更新行時(shí)自動插入它。我寫了一個(gè)數(shù)據(jù)庫觸發(fā)器: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();哪個(gè)工作正常,但我想知道是否有更簡單的方法使用 jpa/hibernate 注釋來做到這一點(diǎn)。我嘗試了這些不同的選項(xiàng):@預(yù)更新@PreUpdate    private void onUpdate(){        this.lastEditDate = new Date();    }@更新時(shí)間戳@UpdateTimestamp    @Temporal(TemporalType.TIMESTAMP)    private Date lastEditDate;但是我得到的是,當(dāng)我更新一行時(shí),所有行的時(shí)間戳都會更新,因此表中的所有時(shí)間戳始終相同。我在這里做錯(cuò)了什么?
查看完整描述

2 回答

?
莫回?zé)o

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


查看完整回答
反對 回復(fù) 2021-10-28
  • 2 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號