spring boot 中通过 @mappedsuperclass 定义 baseentity 统一管理 id、createdat 等字段,配合 @enablejpaauditing 和 @createddate 实现自动填充,子类继承即可复用,lombok 简化代码。

在 Java 的 Spring Boot 项目中,通过继承一个通用的 BaseEntity 类,可以统一管理主键(如 id)、创建时间(createdAt)等基础字段,避免每个实体类重复定义。关键在于合理使用 JPA 注解,并配合 Lombok 简化代码。
定义 BaseEntity 并声明通用字段
创建抽象父类 BaseEntity,用 @MappedSuperclass 标记,表示它不作为独立实体映射到数据库表,但其字段可被子类继承并映射:
-
@Id @GeneratedValue声明主键自增(适用于 MySQL 的AUTO_INCREMENT或 PostgreSQL 的SEQUENCE) -
@Column(updatable = false)确保createdAt创建后不可更新 - 用
@CreatedDate和@CreationTimestamp(JPA 或 Hibernate 提供)自动填充时间,需开启 JPA auditing
启用 JPA 审计功能(自动填充时间)
仅定义字段还不够,必须启用审计才能让 @CreatedDate 生效:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在配置类上加
@EnableJpaAuditing(通常放在主启动类或配置类上) - 确保实体字段类型为
LocalDateTime或Timestamp,并搭配@CreatedDate+@Column(insertable = true, updatable = false) - 若用 MyBatis 而非 JPA,则需手动在插入 SQL 中设置
#{createTime}或用拦截器/自动填充插件(如 MyBatis-Plus 的MetaObjectHandler)
子类继承并专注业务字段
业务实体只需 extends BaseEntity,无需再写 id、createdAt 等字段,保持简洁:
- 子类加
@Entity @Table(name = "user")等标准注解 - 业务字段(如
username、email)直接定义,JPA 会把父类字段一并映射进同一张表 - Lombok 可加
@Data或@NoArgsConstructor @AllArgsConstructor简化构造器和 getter/setter
注意点与常见问题
实际使用时容易忽略几个细节:
-
@MappedSuperclass不支持@Inheritance策略(如SINGLE_TABLE),如需多态映射应改用@Inheritance+ 具体策略 - MySQL 中
createdAt字段建议设为NOT NULL DEFAULT CURRENT_TIMESTAMP,与 Java 层双重保障 - 若需更新时间(
updatedAt),可在BaseEntity中增加@LastModifiedDate字段,并确保数据库字段允许更新
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










