
scss 体验AI代码助手 代码解读复制代码// 订单创建逻辑
public void createOrder(OrderDTO dto) {
Order order = convertToEntity(dto);
// 手动设置公共字段
order.setCreateTime(LocalDateTime.now());
order.setUpdateTime(LocalDateTime.now());
order.setCreateUser(getCurrentUser());
order.setUpdateUser(getCurrentUser());
orderMapper.insert(order);
}
// 订单更新逻辑
public void updateOrder(OrderDTO dto) {
Order order = convertToEntity(dto);
// 重复设置逻辑
order.setUpdateTime(LocalDateTime.now());
order.setUpdateUser(getCurrentUser());
orderMapper.updateById(order);
}痛点总结:
kotlin 体验AI代码助手 代码解读复制代码@Slf4j
@Component
publicclass AutoFillHandler implements MetaObjectHandler {
// 插入时自动填充
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createUser", String.class, getCurrentUser());
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateUser", String.class, getCurrentUser());
}
// 更新时自动填充
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateUser", String.class, getCurrentUser());
}
// 获取当前用户(从安全上下文)
private String getCurrentUser() {
return Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.map(Authentication::getName)
.orElse("system");
}
}kotlin 体验AI代码助手 代码解读复制代码@Data
publicclass BaseEntity {
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private String createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateUser;
}
// 订单实体继承基类
publicclass Order extends BaseEntity {
// 业务字段...
}less 体验AI代码助手 代码解读复制代码@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AutoFill {
OperationType value();
}
public enum OperationType {
INSERT,
UPDATE
}less 体验AI代码助手 代码解读复制代码@Aspect
@Component
@Slf4j
publicclass AutoFillAspect {
@Autowired
private ObjectMapper objectMapper;
@Around("@annotation(autoFill)")
public Object around(ProceedingJoinPoint pjp, AutoFill autoFill) throws Throwable {
Object[] args = pjp.getArgs();
for (Object arg : args) {
if (arg instanceof BaseEntity) {
fillFields((BaseEntity) arg, autoFill.value());
}
}
return pjp.proceed(args);
}
private void fillFields(BaseEntity entity, OperationType type) {
String currentUser = getCurrentUser();
LocalDateTime now = LocalDateTime.now();
if (type == OperationType.INSERT) {
entity.setCreateTime(now);
entity.setCreateUser(currentUser);
}
entity.setUpdateTime(now);
entity.setUpdateUser(currentUser);
}
// 获取当前用户(支持多线程环境)
private String getCurrentUser() {
return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
.map(attrs -> (ServletRequestAttributes) attrs)
.map(ServletRequestAttributes::getRequest)
.map(req -> req.getHeader("X-User-Id"))
.orElse("system");
}
}kotlin 体验AI代码助手 代码解读复制代码@Configuration
publicclass DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public MetaObjectHandler metaObjectHandler() {
returnnew MultiDataSourceAutoFillHandler();
}
}
publicclass MultiDataSourceAutoFillHandler extends MetaObjectHandler {
// 根据当前数据源动态处理
}typescript 体验AI代码助手 代码解读复制代码public class SnowflakeIdGenerator {
// 实现分布式ID生成
}
// 在自动填充中集成
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "id", String.class,
idGenerator.nextId());
}scss 体验AI代码助手 代码解读复制代码// 使用Optional处理可能为空的情况
private String safeGetUser() {
return Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.map(Authentication::getPrincipal)
.map(principal -> {
if (principal instanceof UserDetails) {
return ((UserDetails) principal).getUsername();
}
return principal.toString();
})
.orElse("system");
}arduino 体验AI代码助手 代码解读复制代码// 在实体类中使用@TableField策略
@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NEVER)
private String createUser;typescript 体验AI代码助手 代码解读复制代码public class UserContextHolder {
privatestaticfinal ThreadLocal<String> userHolder = new ThreadLocal<>();
public static void setUser(String user) {
userHolder.set(user);
}
public static String getUser() {
return userHolder.get();
}
public static void clear() {
userHolder.remove();
}
}
// 在拦截器中设置
publicclass UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
UserContextHolder.setUser(request.getHeader("X-User-Id"));
returntrue;
}
}scss 体验AI代码助手 代码解读复制代码@Transactional
public void batchInsert(List<Order> orders) {
// 提前获取公共字段值
String user = getCurrentUser();
LocalDateTime now = LocalDateTime.now();
orders.forEach(order -> {
order.setCreateTime(now);
order.setCreateUser(user);
order.setUpdateTime(now);
order.setUpdateUser(user);
});
orderMapper.batchInsert(orders);
}kotlin 体验AI代码助手 代码解读复制代码@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedBy
private String createUser;
@LastModifiedBy
private String updateUser;
@CreatedDate
private LocalDateTime createTime;
@LastModifiedDate
private LocalDateTime updateTime;
}less 体验AI代码助手 代码解读复制代码@Aspect
@Component
public class OperationLogAspect {
@AfterReturning("@annotation(autoFill)")
public void logOperation(AutoFill autoFill) {
LogEntry log = new LogEntry();
log.setOperator(getCurrentUser());
log.setOperationType(autoFill.value().name());
logService.save(log);
}
}结语: 通过本文的六种方案组合使用,我们在生产环境中实现了:
最佳实践清单:
未来展望: 随着Spring Data JPA的演进,未来可以探索与Reactive编程的结合,实现全链路的非阻塞式自动填充。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。