springboot jpa實(shí)現(xiàn)優(yōu)雅處理isDelete的默認(rèn)值
如果多個(gè)實(shí)體類都有 isDelete
字段,并且你希望在插入時(shí)為它們統(tǒng)一設(shè)置默認(rèn)值,可以采取以下幾種方法來(lái)減少代碼重復(fù):
1. 使用基類(抽象類)
創(chuàng)建一個(gè)基類,其中包含 isDelete
字段和 @PrePersist
方法。然后讓所有需要這個(gè)字段的實(shí)體類繼承這個(gè)基類。
示例代碼:
import javax.persistence.MappedSuperclass; import javax.persistence.PrePersist; @MappedSuperclass public abstract class BaseEntity { protected Integer isDelete; @PrePersist public void prePersist() { if (isDelete == null) { isDelete = 0; // 設(shè)置默認(rèn)值為0 } } // Getter 和 Setter public Integer getIsDelete() { return isDelete; } public void setIsDelete(Integer isDelete) { this.isDelete = isDelete; } }
然后在其他實(shí)體類中繼承 BaseEntity
:
import javax.persistence.Entity; import javax.persistence.Id; @Entity public class MyEntity extends BaseEntity { @Id private Long id; // 其他字段、getter 和 setter }
2. 使用 AOP(面向切面編程)
通過(guò) Spring AOP 創(chuàng)建一個(gè)切面,在插入操作時(shí)檢查并設(shè)置 isDelete
的默認(rèn)值。這種方式不需要修改每個(gè)實(shí)體類,適合大規(guī)模應(yīng)用。
示例代碼:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.lang.reflect.Field; @Aspect @Component public class DefaultValueAspect { @PersistenceContext private EntityManager entityManager; @Before("execution(* com.example.repository.*.save(..))") // 根據(jù)你的倉(cāng)庫(kù)路徑調(diào)整 public void setDefaultValues(Object entity) throws IllegalAccessException { Field[] fields = entity.getClass().getDeclaredFields(); for (Field field : fields) { if ("isDelete".equals(field.getName())) { // 檢查字段名 field.setAccessible(true); if (field.get(entity) == null) { field.set(entity, 0); // 設(shè)置默認(rèn)值為0 } } } } }
3. 使用 JPA 審計(jì)功能
使用 Spring Data JPA 的審計(jì)功能,通過(guò)實(shí)現(xiàn) AuditorAware
接口來(lái)統(tǒng)一處理審計(jì)字段,包括 createdBy,createdTime,updatedBy,updatedTime等,而isDelete
這種狀態(tài)字段在審計(jì)注釋中并沒(méi)有實(shí)現(xiàn)。
4. 使用事件監(jiān)聽(tīng)@EntityListeners
JPA 提供了事件監(jiān)聽(tīng)器的功能,你可以定義一個(gè)事件監(jiān)聽(tīng)器來(lái)處理所有需要設(shè)置默認(rèn)值的實(shí)體類。
示例代碼:
import javax.persistence.PostLoad; import javax.persistence.PrePersist; import javax.persistence.EntityListeners; public interface DeletedField { Integer getDeletedFlag(); void setDeletedFlag(Integer deletedFlag); } public class DeleteDefaultValueListener { @PrePersist public void setDefaultValues(DeletedFlagField deletedFlagField) { if (deletedFlagField.getDeletedFlag() == null) { deletedFlagField.setDeletedFlag(0); // 設(shè)置默認(rèn)值為0 } } } @EntityListeners(DefaultValueListener.class) @Entity public class TableUserAccount extends EntityBase implements DeletedFlagField { /** * 刪除標(biāo)識(shí)(邏輯刪除),1刪除 0未刪除 */ @Column(name = "deleted_flag") private Integer deletedFlag; }
5. 擴(kuò)展JPA,對(duì)審計(jì)字段建立者和更新者的擴(kuò)展
- CreatedByField 建立者字段接口
- UpdatedByField 更新者字段接口
- CreatedByDefaultValueListener 建立者字段監(jiān)聽(tīng)器
- UpdatedByDefaultValueListener 更新者字段監(jiān)聽(tīng)器
- AuditorAwareImpl 審計(jì)接口,返回當(dāng)前用戶
CreatedByField
public interface CreatedByField { String getCreatedBy(); void setCreatedBy(String createdBy); }
擴(kuò)展EntityBase實(shí)體,不使用默認(rèn)的CreatedBy和LastModifiedBy
@Getter @Setter @MappedSuperclass @EntityListeners({ AuditingEntityListener.class, UpdatedByDefaultValueListener.class, CreatedByDefaultValueListener.class }) public abstract class EntityBase implements Serializable, CreatedByField, UpdatedByField { /** * 創(chuàng)建人 */ @Column(name = "created_by") private String createdBy; /** * 修改人 */ @Column(name = "updated_by") private String updatedBy; }
CreatedByDefaultValueListener
public class CreatedByDefaultValueListener implements ApplicationContextAware { private ApplicationContext applicationContext; @PrePersist public void setDefaultValues(CreatedByField createdByField) { if (createdByField.getCreatedBy() == null) { if (this.applicationContext.getBean(AuditorAwareImpl.class) != null) { createdByField.setCreatedBy( this.applicationContext.getBean(AuditorAwareImpl.class).getCurrentAuditor().orElse("")); } } } /** * @param applicationContext * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
到此這篇關(guān)于springboot jpa實(shí)現(xiàn)優(yōu)雅處理isDelete的默認(rèn)值的文章就介紹到這了,更多相關(guān)springboot jpa處理isDelete默認(rèn)值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目之在線服裝銷售商城系統(tǒng)的實(shí)現(xiàn)流程
基礎(chǔ)掌握怎么樣,用實(shí)戰(zhàn)檢驗(yàn)就知道了,本篇文章手把手帶你用java+SpringBoot+Maven+Vue+mysql實(shí)現(xiàn)一個(gè)在線服裝銷售商城系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-01-01Feign+mybatisplus搭建項(xiàng)目遇到的坑及解決
這篇文章主要介紹了Feign+mybatisplus搭建項(xiàng)目遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的方法詳解
項(xiàng)目開(kāi)發(fā)中,在處理敏感信息時(shí),數(shù)據(jù)脫敏是一項(xiàng)重要的安全措施,本文主要為大家介紹了如何在SpringBoot項(xiàng)目中進(jìn)行數(shù)據(jù)脫敏處理,有需要的可以了解下2025-03-03java通過(guò)HttpServletRequest獲取post請(qǐng)求中的body內(nèi)容的方法
本篇文章主要介紹了java通過(guò)HttpServletRequest獲取post請(qǐng)求中的body內(nèi)容的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02Java堆&優(yōu)先級(jí)隊(duì)列示例講解(上)
這篇文章主要通過(guò)示例詳細(xì)為大家介紹Java中的堆以及優(yōu)先級(jí)隊(duì)列,文中的示例代碼講解詳細(xì),對(duì)我們了解java有一定幫助,需要的可以參考一下2022-03-03idea上提交項(xiàng)目到gitee 最后出現(xiàn) Push rejected的問(wèn)題處理方法
這篇文章主要介紹了idea上面提交項(xiàng)目到gitee 最后出現(xiàn) Push rejected的問(wèn)題處理方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09如何處理maven倉(cāng)庫(kù)中后綴LastUpdated文件
這篇文章主要介紹了如何處理maven倉(cāng)庫(kù)中后綴LastUpdated文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java動(dòng)態(tài)腳本Groovy獲取Bean技巧
這篇文章主要給大家分享的是Java動(dòng)態(tài)腳本Groovy獲取Bean技巧,在Java代碼中當(dāng)我們需要一個(gè)Bean對(duì)象,通常會(huì)使用spring中@Autowired注解,用來(lái)自動(dòng)裝配對(duì)象。下面我們一起進(jìn)入文章學(xué)習(xí)個(gè)表格多 詳細(xì)內(nèi)容吧2021-12-12