亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

如果多個(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)文章

最新評(píng)論