日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Data JPA 从入门到精通~@PreUpdate异常场景分析

發布時間:2024/7/23 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Data JPA 从入门到精通~@PreUpdate异常场景分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、執行save()后,再次save(),@PreUpdate不再觸發

2、@Transient字段的變更,不會觸發@PreUpdate方法

3、@PreUpdate 不適用加密/解密場景

1、執行save()后,再次save(),@PreUpdate不再觸發

實體:

@Entity @EntityListeners(MyEntityListener.class) class MyEntity{ ... }

監聽器:

class MyEntityListener{@PrePersist@PreUpdatepublic void doSomething(Object entity){ ... } }

使用Spring Data生成的DAO。代碼行為如下:

MyEntity entity = new Entity(); entity = dao.save(entity); // the doSomething() is called here // change something it the entity and save it again dao.save(entity); // the doSomething() is NOT called here, checked with breakpoint

第一次save() 觸發了doSomething(),修復實體后,第二次save()不再觸發doSomething()...

2、@Transient字段的變更,不會觸發@PreUpdate方法

JPA 的 @Transient 注解用于表示一個字段不持久化到數據庫中

有一個用戶實體類,我正在嘗試為此進行密碼哈希處理。我認為最簡單的方法是創建一個用@Transient注釋的密碼字段,以及一個在對象持久化之前設置的用@PrePersist和@PreUpdate注釋的哈希密碼字段。

所以我有這樣的東西

@Transient private String password;private String hashedPassword;@PrePersist @PreUpdate private void hashPassword() {if(password != null) {hashedPassword = PasswordHasher.hashPassword(password);} }

當實體持久存在時,此方法效果很好。密碼字段仍在調用hashPassword時設置,并計算并存儲hashedPassword的值。?

但是,更新并非如此-即使在合并實體之前設置了新的password值,該字段在hashPassword之前也為null叫做。為什么是這樣?至少在實體存在之前,瞬態場的值是否應該一直存在??

3、@PreUpdate 不適用加密/解密場景

如果僅是簡單的單個實體操作,還勉強正確;但是對于一個復雜的聚合,查詢了User,然后再查詢關聯的Company,這樣就會觸發@PreUpdate,導致User的mobile、cardNO又變成加密狀態(關鍵這時候也沒有事務提交動作啊)

@Entity public class User {/*** 手機號.*/private String mobile;/*** 身份證號.*/private String cardNO;//.../*** 保存/更新前自動加密.*/@PrePersist@PreUpdatepublic void encrypt() {final String mobile = this.getMobile();final String cardNO = this.getCardNO();if (!SM4Util.startWithHeader(mobile)) {this.setMobile(SM4Util.encodeSM4Str(mobile));}if (!SM4Util.startWithHeader(cardNO)) {this.setCardNO(SM4Util.encodeSM4Str(cardNO));}}/*** 解密.*/@PostLoadpublic void decrypt() {// 解密.final String decodeMobile = SM4Util.decodeSM4Str(this.getMobile());final String decodeCardNO = SM4Util.decodeSM4Str(this.getCardNO());this.setMobile(decodeMobile);this.setCardNO(decodeCardNO);} }

總結

以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~@PreUpdate异常场景分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。