今天,說(shuō)CallBack,JPA為我們提供了一些在進(jìn)行CURD前后的一些callback methods,這些方法可以在我們進(jìn)行數(shù)據(jù)持久化和查詢前后,進(jìn)行一些操作,比如紀(jì)錄日志。
先來(lái)介紹寫有幾種callback methods annotation:
@PerPresist 持久化之前調(diào)用調(diào)用
@PostPersist 持久化之后(官方文檔是在Object狀態(tài)變成 Persist 狀態(tài))
@PostLoad 查詢之后
@PreUpdate和@PostUpdate 這兩個(gè)分別是在更新之前和之后,不過(guò)這兩個(gè)必須是在PostLoad之后,對(duì)查詢出來(lái)的數(shù)據(jù)進(jìn)行更新,才會(huì)觸發(fā)
@PreRemove和@PostReomve 分別是刪除前和刪除后(官方文檔是Object狀態(tài)變?yōu)閐eleted 狀態(tài))
下面是我的例子,當(dāng)然這里只有關(guān)鍵代碼:
2010年4月22日 星期四
1 @PrePersist
2 public void logPrePersist() {
3 logger.info("PrePersist " + this.getTitle());
4 }
5
6 @PostPersist
7 public void logPostPersist() {
8 logger.info("PostPersist " + this.getTitle());
9 }
10
11 @PostLoad
12 public void logPostLoad() {
13 logger.info("PostLoad " + this.getTitle());
14 }
15
16 @PreUpdate
17 public void logPreUpdate() {
18 logger.info("PreUpdate " + this.getTitle());
19 }
20
21 @PostUpdate
22 public void logPostUpdate() {
23 logger.info("PostUpdate " + this.getTitle());
24 }
25
26 @PreRemove
27 public void logPreRemove() {
28 logger.info("PreRemove " + this.getTitle());
29 }
30
31 @PostRemove
32 public void logPostRemove() {
33 logger.info("PostRemove " + this.getTitle());
34 }
當(dāng)然也可以用Entity Listeners
,如:2 public void logPrePersist() {
3 logger.info("PrePersist " + this.getTitle());
4 }
5
6 @PostPersist
7 public void logPostPersist() {
8 logger.info("PostPersist " + this.getTitle());
9 }
10
11 @PostLoad
12 public void logPostLoad() {
13 logger.info("PostLoad " + this.getTitle());
14 }
15
16 @PreUpdate
17 public void logPreUpdate() {
18 logger.info("PreUpdate " + this.getTitle());
19 }
20
21 @PostUpdate
22 public void logPostUpdate() {
23 logger.info("PostUpdate " + this.getTitle());
24 }
25
26 @PreRemove
27 public void logPreRemove() {
28 logger.info("PreRemove " + this.getTitle());
29 }
30
31 @PostRemove
32 public void logPostRemove() {
33 logger.info("PostRemove " + this.getTitle());
34 }
在實(shí)體類上加上這個(gè)注解:@EntityListeners(value = { MagazineLog.class })
然后寫MagazineLog.java:
1 public class MagazineLog {
2 /**
3 * Logger for this class
4 */
5 private static final Logger logger = LoggerFactory.getLogger(MagazineLog.class);
6
7 @PrePersist
8 public void logPrePersist(Object pc) {
9 logger.info("PrePersist " + ((Magazine)pc).getTitle());
10 }
11
12 @PostPersist
13 public void logPostPersist(Object pc) {
14 logger.info("PostPersist " + ((Magazine)pc).getTitle());
15 }
16
17 @PostLoad
18 public void logPostLoad(Object pc) {
19 logger.info("PostLoad " + ((Magazine)pc).getTitle());
20 }
21
22 @PreUpdate
23 public void logPreUpdate(Object pc) {
24 logger.info("PreUpdate " + ((Magazine)pc).getTitle());
25 }
26
27 @PostUpdate
28 public void logPostUpdate(Object pc) {
29 logger.info("PostUpdate " + ((Magazine)pc).getTitle());
30 }
31
32 @PreRemove
33 public void logPreRemove(Object pc) {
34 logger.info("PreRemove " + ((Magazine)pc).getTitle());
35 }
36
37 @PostRemove
38 public void logPostRemove(Object pc) {
39 logger.info("PostRemove " + ((Magazine)pc).getTitle());
40 }
41 }
就這些,這個(gè)比較簡(jiǎn)單2 /**
3 * Logger for this class
4 */
5 private static final Logger logger = LoggerFactory.getLogger(MagazineLog.class);
6
7 @PrePersist
8 public void logPrePersist(Object pc) {
9 logger.info("PrePersist " + ((Magazine)pc).getTitle());
10 }
11
12 @PostPersist
13 public void logPostPersist(Object pc) {
14 logger.info("PostPersist " + ((Magazine)pc).getTitle());
15 }
16
17 @PostLoad
18 public void logPostLoad(Object pc) {
19 logger.info("PostLoad " + ((Magazine)pc).getTitle());
20 }
21
22 @PreUpdate
23 public void logPreUpdate(Object pc) {
24 logger.info("PreUpdate " + ((Magazine)pc).getTitle());
25 }
26
27 @PostUpdate
28 public void logPostUpdate(Object pc) {
29 logger.info("PostUpdate " + ((Magazine)pc).getTitle());
30 }
31
32 @PreRemove
33 public void logPreRemove(Object pc) {
34 logger.info("PreRemove " + ((Magazine)pc).getTitle());
35 }
36
37 @PostRemove
38 public void logPostRemove(Object pc) {
39 logger.info("PostRemove " + ((Magazine)pc).getTitle());
40 }
41 }