@DynamicInsert注解(默认为true):
如果在实体类上使用此注解,表示insert对象的时候,生成动态的insert语句。
@DynamicUpdate属性(默认为true):
如果在实体类上使用此注解,表示update对象的时候,生成动态的update语句。
看到上面两个注解很欣喜,马上进行了测试
实体类
@Entity
@DynamicUpdate
@DynamicInsert
@Data
@Accessors(chain = true)
public class BuyerAddress {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer addressId;
private String buyerName;
private String buyerPhone;
private String buyerAddress;
private String areaCode;
private Date createTime;
private Date updateTime;
}
测试
@Test
void testUpdate() {
BuyerAddress buyerAddress = new BuyerAddress();
buyerAddress.setAddressId(1);
buyerAddress.setBuyerName("小明");
repository.save(buyerAddress);
}
执行后SQL语句如下:
update
buyer_address
set
area_code=?,
buyer_address=?,
buyer_name=?,
buyer_phone=?,
create_time=?,
update_time=?
where
address_id=?
emmm,根本没用啊,还报错了Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column ‘buyer_address’ cannot be null
查查查,查资料,面向百度编程
找到一段答案,大致这样:
@DynamicUpdate的作用并不是更新指定字段,而是更新变化的字段;如果对象中某个属性为null,当执行更新操作时,如果这个字段在数据库中已经有值了当然会被null覆盖, 因为你save()的对象中这个字段跟数据库中的值不同。如果你更新的字段和数据库中的值相同则不更新该字段,解决方法是先把要更新的数据查询出来,查出原有值再把想变化的字段改变一下,再使用save()保存即可。
更新代码,重新测试
@Test
void testUpdate() {
BuyerAddress buyerAddress = new BuyerAddress();
//先把要更新的数据查询出来
Optional
if (optional.isPresent()) {
buyerAddress = optional.get();
}
//只更新名字
buyerAddress.setBuyerName("小明");
//重新保存
repository.save(buyerAddress);
}
Yes!成功了!
update
buyer_address
set
buyer_name=?
where
address_id=?
3.继续, 接着搞,测试插入操作(时间字段数据库自动生成,默认CURRENT_TIMESTAMP)
当不加@DynamicInsert注解时
@Test
void testInsert() {
BuyerAddress buyerAddress = new BuyerAddress();
buyerAddress.setBuyerName("王二")
.setBuyerPhone("1113214124")
.setBuyerAddress("江苏省徐州市……")
.setAreaCode("22133");
repository.save(buyerAddress);
}
SQL语句如下:
insert
into
buyer_address
(area_code, buyer_address, buyer_name, buyer_phone, create_time, update_time)
values
(?, ?, ?, ?, ?, ?)
时间字段数据库自动生成,不需要插入,所以加上@DynamicInsert
insert
into
buyer_address
(area_code, buyer_address, buyer_name, buyer_phone)
values
(?, ?, ?, ?)