Spring Data JPA中各注解的使用@MappedSuperclass,@LastModifiedDate,@CreatedDate

本文介绍了在Spring Data JPA中如何利用@MappedSuperclass创建可复用的实体基类,并通过@CreatedDate和@LastModifiedDate自动管理创建和修改时间。在实体基类上使用@MappedSuperclass,不需@Entity或@Table注解,子类会继承其属性。同时,文章展示了如何配置AuditorAware接口以获取当前用户信息,并讨论了Temporal注解在处理日期时间格式化中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个Java小白的学习之路 个人博客 youngljx.top

@MappedSuperclass

在进行实体类的封装时,有时候几张表中可能有很多的共同属性。每次都去建立不同的类很麻烦。这个时候可以建立一个共同属性的类,让其他类去继承这个类。然后映射到数据表中,例如编号ID,创建者,创建时间,修改者,修改时间,备注等。
使用环境:

1.@MappedSuperclass注解使用在父类上面,是用来标识父类的

2.@MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够隐射在其子类对用的数据库表中

3.@MappedSuperclass标识的不能再有@Entity或@Table注解,也无需实现序列化接口

@CreatedDate@LastModifiedDate

实现自动更新实体创建时间和修改时间

1、在实体类上加上注解 @EntityListeners(AuditingEntityListener.class)
在相应的字段上添加对应的时间注解 @LastModifiedDate@CreatedDate

/**
 * @author: Mr.Liu
 * @description: 描述实体类的公共配置
 * @date: 2020-03-11 12:58
 */

@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class) //用于监听实体类添加或者删除操作
public class BaseBean {
    /**
    * @Description: 自增长id
    */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * @Description:创建时间
     */
    @CreatedDate
    @Column(nullable = false ,updatable = false)
    //updatable = false表示不进行更新操作 否则更新数据时会出现createTime变为null
    private Date createTime;

    /**
     * @Description: 修改时间
     */
    @LastModifiedDate
    @Column(nullable = false)
    private Date modifyTime;
    
   /**
     *  @Description: 创建人
     */
    @CreatedBy
    private Integer createBy;
 
    /**
     * @Description: 最后修改人
     */
    @LastModifiedBy
    private Integer lastModifiedBy;
 
}

2、在Application启动类中添加注解 @EnableJpaAuditing

@EnableJpaAuditing
@SpringBootApplication
public class TestApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

配置实现AuditorAware接口,以获取字段需要插入的信息:

@Configuration
public class AuditorConfig implements AuditorAware<Integer> {
 
    /**
     * 返回操作员标志信息
     *
     * @return
     */
    @Override
    public Optional<Integer> getCurrentAuditor() {
        // 这里应根据实际业务情况获取具体信息
        return Optional.of(new Random().nextInt(1000));
    }
 
}

另外数据库添加相应控制也可以实现:
createTime : CURRENT_TIMESTAMP
modifyTime : CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

补充:
Hibernate 也提供了类似上述时间注解的功能实现,这种方法只需要一步配置,
更改为注解 @UpdateTimestamp@CreationTimestamp 即可:

@Data
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
 
    @UpdateTimestamp
    @Column(nullable = false)
    private Date updateTime;
 
    @CreationTimestamp
    @Column(nullable = false, updatable = false)
    private Date createTime;
 
    @NotNull
    private Boolean deleted = false;
 
}

参考 Spring Data JPA 的时间注解:@CreatedDate 和 @LastModifiedDate

Hibernate @Temporal()注解的使用
Temporal注解的作用就是帮Java的Date类型进行格式化,一共有三种注解值:

第一种:@Temporal(TemporalType.DATE)——>实体类会封装成日期“yyyy-MM-dd”的 Date类型。
第二种:@Temporal(TemporalType.TIME)——>实体类会封装成时间“hh-MM-ss”的 Date类型。
第三种:@Temporal(TemporalType.TIMESTAMP)——>实体类会封装成完整的时间“yyyy-MM-dd hh:MM:ss”的 Date类型

写在字段上:

@Temporal(TemporalType.TIMESTAMP)
private Date birthday;

写在 getXxx方法上:

@Temporal(TemporalType.DATE)
@Column(name = "birthday", length = 10)
public Date getBirthday() {
    return this.birthday;
}

参考 https://www.cnblogs.com/meng-ma-blogs/p/8474175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值