乐趣区

关于jpa:JPA大坑-无法像mybaits一样在currentat字段自动生成创建时间

JPA 大坑,无奈像 mybaits 一样在 current_at 字段,主动生成创立工夫

mybatis
jpa 下实体类的保留

mybatis

在 mybatis 我的项目中,咱们个别会应用它的插件 plus 以裁减它的根本查问性能。另一方面,在阿里巴巴开发手册的标准中也提到,在数据库表创立的时候,个别会有一个 create_time 和 update_time 字段,它们的建表语句往往如下:

‘create_time’ timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
‘update_time’ timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

创建者则是心愿在行 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

退出移动版