最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot jpa實現(xiàn)優(yōu)雅處理isDelete的默認(rèn)值

 更新時間:2024年11月19日 08:21:52   作者:張占嶺  
如果多個實體類都有 isDelete 字段,并且你希望在插入時為它們統(tǒng)一設(shè)置默認(rèn)值時改怎么做呢,本文為大家整理了一些方法,希望對大家有所幫助

如果多個實體類都有 isDelete 字段,并且你希望在插入時為它們統(tǒng)一設(shè)置默認(rèn)值,可以采取以下幾種方法來減少代碼重復(fù):

1. 使用基類(抽象類)

創(chuàng)建一個基類,其中包含 isDelete 字段和 @PrePersist 方法。然后讓所有需要這個字段的實體類繼承這個基類。

示例代碼:

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;
    }
}

然后在其他實體類中繼承 BaseEntity

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class MyEntity extends BaseEntity {

    @Id
    private Long id;

    // 其他字段、getter 和 setter
}

2. 使用 AOP(面向切面編程)

通過 Spring AOP 創(chuàng)建一個切面,在插入操作時檢查并設(shè)置 isDelete 的默認(rèn)值。這種方式不需要修改每個實體類,適合大規(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ù)你的倉庫路徑調(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 審計功能

使用 Spring Data JPA 的審計功能,通過實現(xiàn) AuditorAware 接口來統(tǒng)一處理審計字段,包括 createdBy,createdTime,updatedBy,updatedTime等,而isDelete這種狀態(tài)字段在審計注釋中并沒有實現(xiàn)。

4. 使用事件監(jiān)聽@EntityListeners

JPA 提供了事件監(jiān)聽器的功能,你可以定義一個事件監(jiān)聽器來處理所有需要設(shè)置默認(rèn)值的實體類。

示例代碼:

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)識(邏輯刪除),1刪除 0未刪除
	 */
	@Column(name = "deleted_flag")
	private Integer deletedFlag;
}

5. 擴展JPA,對審計字段建立者和更新者的擴展

  • CreatedByField 建立者字段接口
  • UpdatedByField 更新者字段接口
  • CreatedByDefaultValueListener 建立者字段監(jiān)聽器
  • UpdatedByDefaultValueListener 更新者字段監(jiān)聽器
  • AuditorAwareImpl 審計接口,返回當(dāng)前用戶

CreatedByField

public interface CreatedByField {

	String getCreatedBy();

	void setCreatedBy(String createdBy);

}

擴展EntityBase實體,不使用默認(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實現(xiàn)優(yōu)雅處理isDelete的默認(rèn)值的文章就介紹到這了,更多相關(guān)springboot jpa處理isDelete默認(rèn)值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 工具類總結(jié)目錄(分享)

    Java 工具類總結(jié)目錄(分享)

    下面小編就為大家?guī)硪黄狫ava 工具類總結(jié)目錄(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 基于Java設(shè)計一個短鏈接生成系統(tǒng)

    基于Java設(shè)計一個短鏈接生成系統(tǒng)

    相信大家在生活中會收到很多短信,而這些短信都有一個特點是鏈接很短。這些鏈接背后的原理是什么呢?怎么實現(xiàn)的?小編今天就帶你們詳細(xì)了解一下
    2021-12-12
  • JAVA 數(shù)據(jù)結(jié)構(gòu)之Queue處理實例代碼

    JAVA 數(shù)據(jù)結(jié)構(gòu)之Queue處理實例代碼

    這篇文章主要介紹了JAVA 數(shù)據(jù)結(jié)構(gòu)之Queue處理實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java監(jiān)聽器實現(xiàn)在線人數(shù)統(tǒng)計

    java監(jiān)聽器實現(xiàn)在線人數(shù)統(tǒng)計

    這篇文章主要為大家詳細(xì)介紹了java監(jiān)聽器實現(xiàn)在線人數(shù)統(tǒng)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Java中實現(xiàn)日志記錄的方案總結(jié)

    Java中實現(xiàn)日志記錄的方案總結(jié)

    在平時使用到一些軟件中,比如某寶或者某書,通過記錄用戶的行為來構(gòu)建和分析用戶的行為數(shù)據(jù),這就需要使用到日志系統(tǒng)來存儲或者記錄數(shù)據(jù),小編為大家整理了幾種Java日志方案,希望對大家有所幫助
    2024-12-12
  • Java中避免空指針檢查的方法小結(jié)

    Java中避免空指針檢查的方法小結(jié)

    在Java編程中,NullPointerException 是一個常見的運行時異常,為了避免該異常,開發(fā)者常常需要編寫大量的 x != null 檢查代碼,然而,過多的空指針檢查會使代碼變得冗長和難以維護,所以本文給大家介紹了Java中避免空指針檢查的方法,需要的朋友可以參考下
    2025-06-06
  • Java 棧和隊列的相互轉(zhuǎn)換詳解

    Java 棧和隊列的相互轉(zhuǎn)換詳解

    棧和隊列,嚴(yán)格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨作為一章,做重點講解
    2022-02-02
  • 淺析Java項目中如何同時連接多個Redis實例

    淺析Java項目中如何同時連接多個Redis實例

    在現(xiàn)代分布式系統(tǒng)中,Redis作為高性能的內(nèi)存數(shù)據(jù)庫,廣泛應(yīng)用于緩存,會話存儲,消息隊列等場景,本文我們就來看看如何在Java項目中同時連接多個Redis實例吧
    2025-06-06
  • Java幾個實例帶你進階升華上篇

    Java幾個實例帶你進階升華上篇

    與其明天開始,不如現(xiàn)在行動,本文為你帶來幾個Java書寫的實際案例,對鞏固編程的基礎(chǔ)能力很有幫助,快來一起往下看看吧
    2022-03-03
  • Java變量的初始化及靜態(tài)方法的實現(xiàn)

    Java變量的初始化及靜態(tài)方法的實現(xiàn)

    這篇文章主要介紹了Java變量的初始化及靜態(tài)方法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論

孝感市| 宜川县| 双流县| 兴仁县| 西藏| 蓬莱市| 杭锦后旗| 通许县| 塔城市| 合阳县| 巫溪县| 电白县| 泸溪县| 大渡口区| 湘潭市| 南乐县| 常宁市| 呼玛县| 腾冲县| 柳州市| 监利县| 孙吴县| 穆棱市| 宁明县| 浙江省| 民权县| 兖州市| 五寨县| 佳木斯市| 桦川县| 尉氏县| 遂宁市| 贵港市| 涿州市| 古田县| 柳河县| 海盐县| 汝阳县| 博兴县| 凤城市| 金坛市|