spring-data-jpa使用日期

在以往的一些项目中,我们在每张mysql表创建的时候都会增加两个时间字段,create_time和update_time.

用户记录数据的入库和更新时间。

但在实体类上,我们并没有将这两个时间字段明确定义出来。字段的赋值都是由mysql自动完成。

比方下面一个建表语句

 CREATE TABLE if not exists `process_info` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `project_code` varchar(255) NOT NULL comment '项目ID',  
   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 comment '工作流表'

但是如果这两个日期需要传递到前端进行展示。

那么实体类中就必须定义了。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "process_info")
public class ProcessInfo implements Serializable {
    private static final long serialVersionUID = 2964930219754666582L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotEmpty
    @ApiModelProperty("项目ID")
    private String projectCode;


    @CreationTimestamp
    @Column(name = "create_time")
    private LocalDateTime createTime;


    @UpdateTimestamp
    @Column(name = "update_time")
    private LocalDateTime updateTime;

    @PrePersist
    protected void onCreate() {
        updateTime = createTime = LocalDateTime.now();
    }

    @PreUpdate
    protected void onUpdate() {
        updateTime = LocalDateTime.now();
    }

}

比较特殊的地方在于,之前的时间创建、更新都是由mysql自动完成。

但现在我们的对象里已经有了这两个字段,如果我们不进行赋值,mysql就会认为我们在这两列要保存成null。

这个时候就跟我们的意图相违背。

也就是说当我们在实体类中创建了这两个字段之后,这两个字段的值的生成的责任就从mysql转移到hibernate中来。

我们需要给这两个字段指定值的生成策略。

posted @ 2022-07-05 10:38  Mars.wang  阅读(469)  评论(0编辑  收藏  举报