参考
@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);
下面是数据库截图
4. 修改的时候,千万不要以为这两个注解不会为字段值为null的字段生成sql,如果前端传进来一个实体对象,部分字段没有传,这时候如果使用xxxRepository.save(entity) 方法,他会把null的字段设置为空,而不是不生成sql,详情看↓下面我的测试<a name="RjWi1"></a>## bean代码```javapackage 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 //动态赋值@SelectBeforeUpdatepublic 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=?- 不判断数据是否相等强行为新的为准
- 没有起到 更新是空字段不跟新的作用
- 加了注解:
