一、背景
jpa编程中,我们一般会设计以下五个字段:
在新增记录的时候,无需对创建时间和修改时间进行赋值。
此外,你还得在类上,增加注解@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()方法并不是每次都会刷新修改时间。