JPA大坑 ,无法像mybaits一样在current_at字段,自动生成创建时间

mybatis
jpa下实体类的保存

mybatis

在mybatis项目中,我们一般会使用它的插件plus以扩充它的基本查询功能。另一方面,在阿里巴巴开发手册的规范中也提到,在数据库表创建的时候,一般会有一个create_time和update_time字段,它们的建表语句往往如下:

创建者则是希望在行insert的时候会自动生成create_time,同时在其它行进行修改后,执行update操作会自动更新update_time字段。这样简化了开发,只要存储业务字段就可以了,开发者不用管时间字段的生成。

jpa下实体类的保存

新项目使用jpa,我也想当然的在表下create_at字段设置 NOT NULL DEFAULT CURRENT_TIMESTAMP,结果调save(entity)保存实体类的时候,发现根本没有像我想的那样在创建时间字段保存insert的时间,所有生成时间字段都为null…
打印sql语句才发现,原先调jpa的save方法,默认jpa会把所有字段都insert,为空的话就会自己设置null insert到表中,导致字段设置NOT NULL DEFAULT CURRENT_TIMESTAMP失效,所有的创建时间字段都得自己set当前时间这个与业务无关的字段,忘了的话就会报错了,效率低容易出错。最后发现还得在相应的实体类字段写如下注释才可以实现与mybaits相同的效果,交由数据库去实现创建时间的创建。


    @Column(name = "create_at",insertable = false,updatable = false,columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private Date createAt;
    @Column(name = "update_at",insertable = false,updatable = false,columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    private Date updateAt;

columnDefinition和后面的设置,就等于在数据库中设置DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP了,这样设置就会让createTime成为创建时间,updateTime成为更新时间,数据库会自动去维护他。

但是还有一个问题,jpa调用save方法时,会把这两个字段覆盖掉。所以这里需要insertable = false,updatable = false,这样jpa更新插入时就不会去更新这个字段了,而是完全由数据库维护。
参考文档:
https://blog.csdn.net/weixin_30666401/article/details/96759783

03-05 20:55