Spring Data JPA註解@DynamicInsert和@DynamicUpdate
阿新 • • 發佈:2019-01-08
Hibernate,JPA註解@DynamicInsert和@DynamicUpdate
- @DynamicInsert屬性:設定為true,設定為true,表示insert物件的時候,生成動態的insert語句,如果這個欄位的值是null就不會加入到insert語句當中.預設false。
比如希望資料庫插入日期或時間戳欄位時,在物件欄位為空的情況下,表字段能自動填寫當前的sysdate。
- @DynamicUpdate屬性:設定為true,設定為true,表示update物件的時候,生成動態的update語句,如果這個欄位的值是null就不會被加入到update語句中,預設false。
比如只想更新某個屬性,但是卻把整個物件的屬性都更新了,這並不是我們希望的結果,我們希望的結果是:我更改了哪些欄位,只要更新我修改的欄位就夠了。
舉例說明
看下面列印的sql語句就會立刻明白,使用這兩個註解的效果
@DynamicInsert註解下Hibernate日誌列印SQL:
Hibernate: insert into Cat (cat_name, id) values (?, ?)
反之
Hibernate: insert into Cat (create_time, update_time, cat_name, id) values (?, ?, ?, ?)
@DynamicUpdate註解下Hibernate日誌列印SQL:
說明:如果欄位有更新,Hibernate才會對該欄位進行更新
Hibernate: update Cat set update_time=? where id=?
反之Cat實體類去掉@DynamicUpdate
說明:不管欄位有沒有更新,Hibernate都會對該欄位進行更新
Hibernate: update Cat set update_time=?, cat_name=? where id=?
例如
import lombok.Data;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.sql.Timestamp;
/**
* @author itguang
* @create 2017-11-25 14:02
**/
@Entity
@DynamicInsert
@DynamicUpdate
@Data
@Table(name = "product_info")
public class ProductInfoEntity {
@Id
@Column(name = "product_id")
private String productId;
private String productName;
private BigDecimal productPrice;
private int productStock;
private String productDescription;
private String productIcon;
private Integer productStatus;
private int categoryType;
private Timestamp createTime;
private Timestamp updateTime;
}
總結:
如果我們在更新表時,只想更新某個欄位,就不要加 @DynamicUpdate,通常為了更新表時的效率,都是不加的.
反之,如果我們更新某個欄位時,更新所有的欄位,就可以加上 @DynamicUpdate.
@DynamicInsert 同理.