javascript
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异常场景分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓逆向_10 --- Log 日志的插
- 下一篇: gradle idea java ssm