1. 程式人生 > >Spring Data JPA註解@DynamicInsert和@DynamicUpdate

Spring Data JPA註解@DynamicInsert和@DynamicUpdate

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 同理.