根据您提供的代码,createTime
字段的自动填充不生效可能有以下几个原因:
常见问题排查
未实现 MetaObjectHandler
- MyBatis-Plus 需要实现
MetaObjectHandler
接口来定义填充逻辑:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
// 更新填充逻辑(如果需要)
}
}
- MyBatis-Plus 需要实现
字段名称不一致
- 检查
@TableField(fill = FieldFill.INSERT)
中的字段名是否与数据库列名完全一致(注意大小写和下划线转换)。
- 检查
缺少插件配置 确保在 Spring Boot 配置中启用了 MyBatis-Plus 的自动填充功能:
mybatis-plus:
global-config:
db-config:
logic-not-delete-field: delFlag # 如果有逻辑删除字段
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 可选,开启SQL日志调试
事务或异常干扰
- 如果插入操作在事务中回滚,或者方法被
try-catch
包裹且未重新抛出异常,可能导致填充失败。
- 如果插入操作在事务中回滚,或者方法被
LocalDateTime 支持问题 确保项目中已正确引入对 Java 8 时间类的支持(如 JDBC URL 添加参数):
jdbc:mysql://...?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
快速验证步骤
检查 SQL 日志
开启 MyBatis-Plus SQL 日志,观察插入语句是否包含create_time
字段的值。简化测试
创建一个最小化的单元测试,排除其他业务逻辑干扰:@Test
public void testInsert() {
OrderItem item = new OrderItem();
item.setProductName("Test");
orderItemMapper.insert(item); // 检查生成的 createTime
}
如果仍不生效,建议提供更多上下文信息(如完整的 Mapper、Service 代码和 SQL日志),我可以进一步帮您分析。
内容由零声教学AI助手提供,问题来源于学员提问