hibernate中的“坑”
程序员文章站
2022-03-15 14:03:19
...
1. 新建时save()接口返回的对象就是参数对象
所以如果想利用保存来获取数据里各个字段默认值的时候要小心。比如下面的例子。
class A {
protected Long id;
protected LocalDateTime createTime;
protected LocalDateTime updateTime;
}
A a=save(new A());
// 此时,a的id仍然为空
2. 注意@DynamicInsert和@DynamicUpdate的不同
@DynamicInsert 是用非空的列来组装sql
@DynamicUpdate 是用改变的列来组装sql
下面是一个常见的场景:
提供给前端页面用来保存数据的接口,一般传入的参数比数据库中的字段少。比如数据库中有10列,但前端界面可以修改的只有3列,前端传入的参数也只有这3个属性,最终保存之前,由参数转化成的entity应该是3个属性有值,而其它属性为null。这时如果直接保存,会把数据库中其它7个属性都置为空。原因就是这两个注解很容易混淆,@DynamicUpdate 是用改变的列来组装sql,而不是非空的列。
正确的做法是应该先从数据库中把旧对象给查出来,再把新对象缺少的属性从旧对象复制过去,然后再保存。(一点都不智能ヽ(`Д´)ノ)