詳情頁(yè)通用模板北京百度seo
JPA提供了一種事件監(jiān)聽(tīng)器的機(jī)制,用于SQL審計(jì),通過(guò)監(jiān)聽(tīng)器我們可以很快速地去自動(dòng)更新創(chuàng)建時(shí)間、修改時(shí)間,主要步驟如下:
一、創(chuàng)建基礎(chǔ)實(shí)體,包含了創(chuàng)建和修改時(shí)間,然后讓其他真正的實(shí)體繼承該實(shí)體,減少重復(fù)冗余代碼
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public class AbstractAuditEntity implements Serializable {@CreatedDate@Column(name = "create_time", nullable = false, updatable = false)private Date createTime;@LastModifiedDate@Column(name = "update_time", nullable = false)private Date updateTime;
}
注意,需要兩個(gè)注解,MappedSuperclass代表是基礎(chǔ)實(shí)體,不會(huì)創(chuàng)建數(shù)據(jù)庫(kù)表,EntityListeners注解啟用監(jiān)聽(tīng)器,我們需要使用的是AuditingEntityListener這個(gè)監(jiān)聽(tīng)器。
同時(shí),CreatedDate、LastModifiedDate代表會(huì)在創(chuàng)建和修改時(shí)更新時(shí)間字段,包括創(chuàng)建時(shí)間和修改時(shí)間。
二、啟用JPA的審計(jì)功能
啟動(dòng)類(lèi)需要加上EnableJpaAuditing注解。
三、修改已有實(shí)體類(lèi)
四、如果已經(jīng)集成QueryDSL,請(qǐng)重新compile一下:
可以看到會(huì)自動(dòng)加上super相關(guān)字段。
五、調(diào)試接口查看下效果:
默認(rèn)createTime和updateTime都會(huì)填上,然后我們?cè)囅滦薷?#xff1a;
我們會(huì)發(fā)現(xiàn),修改后,更新時(shí)間為什么沒(méi)有發(fā)生改變?
原因::JSR 317規(guī)范指出,對(duì)實(shí)體類(lèi)的生命周期操作,不應(yīng)該通過(guò)EntityManager或Query注解實(shí)現(xiàn),所以Audit無(wú)法捕獲Query注解產(chǎn)生的更新。例如:
解決方法是,單獨(dú)更新時(shí)間,或通過(guò)JPA標(biāo)準(zhǔn)規(guī)范更新實(shí)體,如下:
最終效果:
可以看到CREATE_TIME和UPDATE_TIME都更新了。