中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

jpa~為字段添加(jia)insert的默(mo)認值

前言

如果多個實體類都有 isDelete 字段,并且你希望(wang)在插入時為它們統一設置默認值,可以(yi)采取以(yi)下幾種方法來減少(shao)代碼重(zhong)復:

1. 使用基類(抽象類)

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

示例代碼:

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; // 設置默認值為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 創建一個切面,在插入操作時檢查并設置 isDelete 的默認值。這種(zhong)方(fang)式不(bu)需要(yao)修改(gai)每(mei)個實體類,適合大規(gui)模應用。

示例代碼:

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(..))") // 根據你的倉庫路徑調整
    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); // 設置默認值為0
                }
            }
        }
    }
}

3. 使用 JPA 審計功能

使用 Spring Data JPA 的審計功能,通過實現 AuditorAware 接口來統一處理審計字段,包括 建立時間(jian),更新時間(jian),建立人,刪除人等(deng),這個(ge)功能比較局限

示例代碼:

@EntityListeners(AuditingEntityListener.class)
public abstract class EntityBase implements Serializable {

	/**
	 * 創建人
	 */
	@Column(name = "created_by")
	@CreatedBy
	private String createdBy;

	/**
	 * 修改人
	 */
	@Column(name = "updated_by")
	@LastModifiedBy
	private String updatedBy;

	/**
	 * 創建時間
	 */
	@Column(name = "created_time")
	@CreatedDate
	private java.time.LocalDateTime createdTime;

	/**
	 * 更新時間
	 */
	@Column(name = "update_time")
	@LastModifiedDate
	private java.time.LocalDateTime updateTime;

}

// 基于dubbo下的netty中獲取當前請求頭中的用戶名
@EnableJpaAuditing
@Component
public class AuditorAwareImpl implements AuditorAware<String> {

	@Override
	public Optional<String> getCurrentAuditor() {
		Object request = RpcContext.getServiceContext().getRequest();
		if (request != null) {
			NettyRequestFacade requestFacade = (NettyRequestFacade) request;

			if (requestFacade != null && requestFacade.getHeader("username") != null) {
				return Optional.of(requestFacade.getHeader("username"));
			}
		}
		return Optional.of("none");
	}

}

4. 使用事件監聽@EntityListeners

JPA 提供了事件監聽(ting)器的(de)功能(neng),你(ni)可以定義一個(ge)事件監聽(ting)器來處(chu)理所有需要(yao)設(she)置(zhi)默(mo)認值的(de)實體類。

示例代碼:

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); // 設置默認值為0
		}
	}

}

@EntityListeners(DefaultValueListener.class)
@Entity
public class TableUserAccount extends EntityBase implements DeletedFlagField {

  	/**
	 * 刪除標識(邏輯刪除),1刪除 0未刪除
	 */
	@Column(name = "deleted_flag")
	private Integer deletedFlag;
}
posted @ 2024-09-27 15:07  張占嶺  閱讀(370)  評論(0)    收藏  舉報