JPA编程使用注解@LastModifiedDate,自动更新修改时间字段

一、背景

jpa编程中,我们一般会设计以下五个字段:
JPA编程使用注解@LastModifiedDate,自动更新修改时间字段_第1张图片
在新增记录的时候,无需对创建时间和修改时间进行赋值。

此外,你还得在类上,增加注解@EntityListeners(AuditingEntityListener.class)。

@EntityListeners(AuditingEntityListener.class)
public class Lecture {

    @Column(name = "task_count", nullable = false, columnDefinition = "INT default 0 COMMENT '任务总数'")
    private int taskCount;
    
// 其他字段省略,本文重点对象是修改时间
    @LastModifiedDate
    @CreatedDate
    @Column(name = "modified_date", columnDefinition = "datetime DEFAULT NOW() COMMENT '修改时间'")
    private Date modifiedDate;
}

然后你在更新任务数的时候,理所当然,jpa会自动更新修改时间。

实际上,当你的任务数没有变化的时候,是不会更新其修改时间。

如果你的程序对修改时间字段是否变更,涉及到其他的业务逻辑,那么希望你引起重视,还是老实地手动给修改时间赋值吧。

二、实现

  • 修改前的代码
      Lecture lecture = lectureRepository.findById(lectureId);

      lecture.updateTaskCount(request.getTaskCount());
      lectureRepository.save(lecture);
      
    /**
     * 更新任务数.
     *
     * @param taskCount
     * @return
     */
    public boolean updateTaskCount(Integer taskCount) {
        boolean hasUpdate = false;
        if (null != taskCount && this.taskCount != taskCount) {
            this.taskCount = taskCount;
            hasUpdate = true;
        }
        return hasUpdate;
    }

这种写法,如果原本taskCount = 3, 然后你调用该方法,再save()的话,是不会自动更新修改时间。

  • 修改后的写法
      Lecture lecture = lectureRepository.findById(lectureId);
      Date refreshDate = DateUtil.date();
      lecture.updateTaskCount(request.getTaskCount(), refreshDate);
      lectureRepository.save(lecture);
            
/**
     * 更新任务数.
     *
     * @param taskCount
     * @param modifiedDate
     * @return
     */
    public boolean updateTaskCount(Integer taskCount, Date modifiedDate) {
        boolean hasUpdate = false;
        if (null != taskCount && this.taskCount != taskCount) {
            this.taskCount = taskCount;
            hasUpdate = true;
        }
        // 无论有无任务数的变更,都刷新更新时间(如果缺少下行,当没有任务数的变化,则更新时间不会刷新)
        this.modifiedDate = modifiedDate;
        return hasUpdate;
    }

三、总结

希望本文能够帮助到你,调用jpa的save()方法并不是每次都会刷新修改时间。

你可能感兴趣的:(java,hibernate,spring)