如果多个实体类都有 isDelete
字段,并且你希望在插入时为它们统一设置默认值,可以采取以下几种方法来减少代码重复:
1. 使用基类(抽象类)
创建一个基类,其中包含 isDelete
字段和 @PrePersist
方法。然后让所有需要这个字段的实体类继承这个基类。
示例代码:
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;@MappedSuperclass
public abstract class BaseEntity {protected Integer isDelete;@PrePersistpublic void prePersist() {if (isDelete == null) {isDelete = 0; // 设置默认值为0}}// Getter 和 Setterpublic 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 {@Idprivate Long id;// 其他字段、getter 和 setter
}
2. 使用 AOP(面向切面编程)
通过 Spring AOP 创建一个切面,在插入操作时检查并设置 isDelete
的默认值。这种方式不需要修改每个实体类,适合大规模应用。
示例代码:
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 {@PersistenceContextprivate 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
接口来统一处理审计字段,包括 isDelete
。这种方法适合需要更多审计信息的情况,但实现起来相对复杂。
总结
- 基类:通过创建一个基类,所有需要
isDelete
字段的实体类都可以继承这个基类,避免重复代码。 - AOP:使用 AOP 可以在插入时动态处理
isDelete
字段,适合大型项目。 - JPA 审计功能:适合更复杂的审计需求,但实现较复杂。
选择合适的方法取决于你的项目需求和架构。
使用事件监听@EntityListeners
JPA 提供了事件监听器的功能,你可以定义一个事件监听器来处理所有需要设置默认值的实体类。
示例代码:
import javax.persistence.PostLoad;
import javax.persistence.PrePersist;
import javax.persistence.EntityListeners;public interface DeletedField {Integer getDeletedFlag();void setDeletedFlag(Integer deletedFlag);
}public class DeleteDefaultValueListener {@PrePersistpublic 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;
}
4. 扩展JPA,对建立者和更新者的扩展
- CreatedByField
- UpdatedByField
- CreatedByDefaultValueListener
- UpdatedByDefaultValueListener
CreatedByField
public interface CreatedByField {String getCreatedBy();void setCreatedBy(String createdBy);}
扩展EntityBase实体,不使用默认的CreatedBy
和LastModifiedBy
@Getter
@Setter
@MappedSuperclass
@EntityListeners({ AuditingEntityListener.class, UpdatedByDefaultValueListener.class,CreatedByDefaultValueListener.class })
public abstract class EntityBase implements Serializable, CreatedByField, UpdatedByField {/*** 创建人*/@Column(name = "created_by")private String createdBy;/*** 修改人*/@Column(name = "updated_by")private String updatedBy;}
CreatedByDefaultValueListener
public class CreatedByDefaultValueListener implements ApplicationContextAware {private ApplicationContext applicationContext;@PrePersistpublic 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*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}}