参考
@DynamicInsert属性:表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中。
@DynamicUpdate属性:表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中。
@SelectBeforeUpdate //配合 @DynamicUpdate
**
注:
- 两个注解加上之后就不会为字段值不变的字段生成sql语句,这样sql的长度就减少了提高了传输效率和执行效率
- 如果不使用:@DynamicInsert 插入时参数为空为导致默认值失效
- 作用域
import com.databstech.cache.jpa.entity.mysql.UuidEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.SelectBeforeUpdate;
import javax.persistence.Column; import javax.persistence.MappedSuperclass;
/**
- @author tn
- @version 1
- @ClassName comm
- @description 测试
- @date 2020/10/2 15:14
*/
@MappedSuperclass
@Getter
@Setter
@Accessors(chain = true)
@DynamicInsert //动态插入
@DynamicUpdate //动态赋值
@SelectBeforeUpdate//配合 @DynamicUpdate
public class comm
extends UuidEntity {
/**
* 表示该字段为创建时间字段,在这个实体被insert的时候,会自动为其赋值
*/
@ApiModelProperty(value = "创建时间",hidden=true)
@Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期' ")
private String createTime;
/**
* 表示该字段为创建人,在这个实体被insert的时候,会自动为其赋值
*/
@ApiModelProperty(value = "创建人",hidden=true)
@Column(columnDefinition = "varchar(100) COMMENT '创建人'")
private String createBy;
/**
* 表示该字段为修改时间字段,在这个实体被update的时候,会自动为其赋值
*/
@ApiModelProperty(value = "修改时间",hidden=true)
@Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期'")
private String updateTime;
/**
* 表示该字段为修改人,在这个实体被update的时候,会自动为其赋值
*/
@ApiModelProperty(value = "修改人",hidden=true)
@Column(columnDefinition = "varchar(100) COMMENT '更新人'")
private String updateBy;
}
bean类
package com.databstech.demo.standalone.jpa.bean;
import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import org.hibernate.annotations.SelectBeforeUpdate;
import javax.persistence.*;
/**
- @author tn
- @version 1
- @ClassName TestDemo
- @description 测试
- @date 2020/10/2 10:16
*/
@Entity
@Table(name =”test_demo”,schema = “test”)
@org.hibernate.annotations.Table(appliesTo = “test_demo”,comment = “test_demo”)
@Getter
@Setter
@Accessors(chain = true)
//@DynamicInsert //动态插入
//@DynamicUpdate //动态赋值
//@SelectBeforeUpdate //配合 @DynamicUpdate
public class TestDemo extends comm
{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(columnDefinition=”int COMMENT ‘主键,自动生成’”) @ApiModelProperty(value = “id”) private Integer id;
@Column(columnDefinition = " varchar(100) not null comment '名字'" )
private String name;
@Column(name = "sex",columnDefinition="varchar(100) default '男' COMMENT '字典名'")
private String sex;
// / // 表示该字段为创建时间字段,在这个实体被insert的时候,会自动为其赋值 // / // @ApiModelProperty(value = “创建时间”,hidden=true) // @Column(columnDefinition = “timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建日期’ “) // private String createTime; // // / // 表示该字段为创建人,在这个实体被insert的时候,会自动为其赋值 // / // @ApiModelProperty(value = “创建人”,hidden=true) // @Column(columnDefinition = “varchar(100) COMMENT ‘创建人’”) // private String createBy; // // / // 表示该字段为修改时间字段,在这个实体被update的时候,会自动为其赋值 // / // @ApiModelProperty(value = “修改时间”,hidden=true) // @Column(columnDefinition = “timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新日期’”) // private String updateTime; // // / // 表示该字段为修改人,在这个实体被update的时候,会自动为其赋值 // / // @ApiModelProperty(value = “修改人”,hidden=true) // @Column(columnDefinition = “varchar(100) COMMENT ‘更新人’”) // private String updateBy;
}
数据库数据
没使用 @MappedSuperclass 但是都用了 @DynamicInsert @DynamicUpdate
INSERT INTO test
.test_demo
(id
, uuid
, name
, sex
, create_time
, create_by
, update_time
, update_by
) VALUES (‘6’, NULL, ‘ada’, NULL, ‘2020-10-02 15:17:25’, NULL, ‘2020-10-02 15:17:25’, NULL);
使用 @MappedSuperclass 但是继承类没有使用@DynamicInsert @DynamicUpdate
INSERT INTO test
.test_demo
(id
, uuid
, name
, sex
, create_time
, create_by
, update_time
, update_by
) VALUES (‘8’, NULL, ‘ada’, NULL, NULL, NULL, NULL, NULL);
使用 @MappedSuperclass 但是继承类使用@DynamicInsert @DynamicUpdate
INSERT INTO test
.test_demo
(id
, uuid
, name
, sex
, create_time
, create_by
, update_time
, update_by
) VALUES (‘9’, NULL, ‘ada’, ‘男’, ‘2020-10-02 15:24:17’, NULL, ‘2020-10-02 15:24:17’, NULL);
下面是数据库截图
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1642320/1601623938091-bc4417e1-7981-4792-843f-8768bf89b4fd.png#align=left&display=inline&height=114&margin=%5Bobject%20Object%5D&name=image.png&originHeight=114&originWidth=1506&size=17315&status=done&style=none&width=1506)
4. 修改的时候,千万不要以为这两个注解不会为字段值为null的字段生成sql,如果前端传进来一个实体对象,部分字段没有传,这时候如果使用xxxRepository.save(entity) 方法,他会把null的字段设置为空,而不是不生成sql,详情看↓下面我的测试
<a name="RjWi1"></a>
## bean代码
```java
package com.databstech.demo.standalone.jpa.bean;
import com.databstech.cache.jpa.entity.mysql.UuidEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SelectBeforeUpdate;
import javax.persistence.*;
/**
* @author tn
* @version 1
* @ClassName TestDemo
* @description 测试
* @date 2020/10/2 10:16
*/
@Entity
@Table(name ="test_demo",schema = "test")
@org.hibernate.annotations.Table(appliesTo = "test_demo",comment = "test_demo")
@Getter
@Setter
@Accessors(chain = true)
@DynamicInsert //动态插入
@DynamicUpdate //动态赋值
@SelectBeforeUpdate
public class TestDemo extends UuidEntity<TestDemo> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition="int COMMENT '主键,自动生成'")
@ApiModelProperty(value = "id")
private Integer id;
@Column(columnDefinition = " varchar(100) not null comment '名字'" )
private String name;
@Column(name = "sex",columnDefinition="varchar(100) default '男' COMMENT '字典名'")
private String sex;
/**
* 表示该字段为创建时间字段,在这个实体被insert的时候,会自动为其赋值
*/
@ApiModelProperty(value = "创建时间",hidden=true)
@Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期' ")
private String createTime;
/**
* 表示该字段为创建人,在这个实体被insert的时候,会自动为其赋值
*/
@ApiModelProperty(value = "创建人",hidden=true)
@Column(columnDefinition = "varchar(100) COMMENT '创建人'")
private String createBy;
/**
* 表示该字段为修改时间字段,在这个实体被update的时候,会自动为其赋值
*/
@ApiModelProperty(value = "修改时间",hidden=true)
@Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期'")
private String updateTime;
/**
* 表示该字段为修改人,在这个实体被update的时候,会自动为其赋值
*/
@ApiModelProperty(value = "修改人",hidden=true)
@Column(columnDefinition = "varchar(100) COMMENT '更新人'")
private String updateBy;
}
我测试:
- 插入
- 没加注解时:
- 只传一个参数,其他为空,sql为:
insert into test_demo (uuid, name, sex, create_time, create_by, update_time, update_by) values (?, ?, ?, ?, ?, ?, ?)
- 只传一个参数,其他为空,sql为:
- 加了注解时:
- 只传一个参数,其他为空,sql为:
insert into test_demo (name) values (?)
- 只传一个参数,其他为空,sql为:
- 没加注解时:
- 修改不起作用还是会置空原来的属性
- 加了注解:
update test_demo set name=?, sex=?, create_time=?, update_time=? where id=?
- 数据库跟查询的结果相同时则不带上该条数据
- 没加注解:
update test_demo set uuid=?, name=?, sex=?, create_time=?, create_by=?, update_time=?, update_by=? where id=?
- 不判断数据是否相等强行为新的为准
- 没有起到 更新是空字段不跟新的作用
- 加了注解: