【hibernate】常用注解


【hibernate】常用注解

轉載:https://www.cnblogs.com/yangchongxing/p/10357118.html

目錄

========================================================

1、@Entity 實體

2、@Table 表

3、@Id 和 @GeneratedValue 主鍵及生成策略

4、@Column 列

5、@DynamicInsert 和 @DynamicUpdate 動態字段

6、@Immutable 不變實體

7、@Basic 非空約束

8、@NotNull 非空檢查

9、@Access 屬性訪問

10、@Formula 派生屬性

11、@ColumnTransformer 轉換列值

12、@Generated 默認值

13、@Temporal 時序屬性

14、@CreationTimestamp和@UpdateTimestamp 創建時間戳和更新時間戳

15、@Enumerated 枚舉類型

16、@Embeddable 可嵌入組件

17、@Lob 大數據類型

18、@Type 類型適配器

19、@Convert 轉換器

20、@MappedSuperclass 不持久化超類屬性

21、@AttributeOverrides 和 @AttributeOverride 重寫屬性

22、@Inheritance 繼承策略

========================================================

1、@Entity 實體

聲明持久化實體,不帶 name 參數時表明和實體名相同,帶參數重寫表明 @Entity(name="ycx_user")

2、@Table 表

重寫表名 @Table(name="ycx_user")

3、@Id 和 @GeneratedValue 主鍵及生成策略

主鍵和主鍵生成策略 @GeneratedValue(generator="id_generator") 或者 @GeneratedValue(strategy=GenerationType.SEQUENCE)

4、@Column 列

name="列名"

table=“列屬表名”

nullable=false 不能為空,生成非空約束

length=3 字段長度

insertable=false 不包含 INSERT

updatable=false 不包含 UPDATE

列聲明 @Column(name="表明", nullable=false),nullable=false 聲明數據庫非空約束

5、@DynamicInsert 和 @DynamicUpdate 動態字段

動態 SQL 生成,@DynamicInsert 和 @DynamicUpdate,通過啟用動態插入和更新,就可以告知 hibernate 在需要時生成 SQL 字符串

6、@Immutable 不變實體

讓實體不可變,這樣 hibernate 永遠不會執行 update 語句,同時可以進行一些優化,比如對不可變類不進行臟檢查。

7、@Basic 非空約束

@Basic(optional=false) 聲明數據庫非空約束

8、@NotNull 非空檢查

@NotNull(message="消息內容"),實體非空注解,但是這個在生成數據庫結構時會被忽略,在實體保存校驗時起作用。

要想在數據庫中生成非空約束,必須結合 @Column(nullable=false) 或者 @Basic(optional=false)

9、@Access 屬性訪問

重寫默認的訪問行為,字段訪問或者屬性訪問,已經注解過的實體會從強制的 @Id 注解位置繼承訪問行為,@Id 在字段上則繼承字段訪問,在 getter 方法上則繼承屬性訪問。

@Access(AccessType.FIELD) 字段訪問

@Access(AccessType.PROPERTY) 屬性訪問

當 @Access 在實體級別設置則會影響實體的所有訪問策略,同樣 @Access 也可以重寫單個屬性的訪問策略

若默認是字段訪問,在字段上添加 @Access(AccessType.PROPERTY) 則被修改為屬性訪問

若默認是屬性訪問,在 getter 方法上添加 @Access(AccessType.FIELD) 則被修改為字段訪問

10、@Formula 派生屬性

運行時通過 @Formula 估算出來,不會出現在 UPDATE 和 INSERT 中,只會出現在 SELECT 中,可以包含 SQL 函數和子查詢。

例如 數據庫中沒有全名而實體中有 @Formula("concat(firstname,'-',lastname)")

11、@ColumnTransformer 轉換列值

數據庫中存儲重量 weight 單位是克,實體中使用千克

@Column(name="weight")
    @org.hibernate.annotations.ColumnTransformer(read="weight / 1000",write="? * 1000")
    protected int kilogramWeight;

12、@Generated 默認值

自動刷新數據庫生成的值,如觸發器在每次插入和更新后更新的值。使用 @Generated 注解在每次執行 INSERT 和 UPDATE 后委托給 Hibernate 自動查詢。

比如插入用戶后給一個默認國籍

觸發器

BEGIN
set new.nationality = 'CN';
END

java

    @Column(insertable=false,updatable=false)
    @org.hibernate.annotations.ColumnDefault("'CN'") //在 Hibernate 導出 SQL 架構 DDL 時設置列的默認值
    @org.hibernate.annotations.Generated(org.hibernate.annotations.GenerationTime.INSERT)
    protected String nationality;

測試

    @Test
    public void testInsert() {
        this.session.beginTransaction();
        User u = new User();
        u.setUsername("admin");
        u.setFirstname("Tom");
        u.setLastname("Green");
        u.setKilogramWeight(62);
        this.session.persist(u);
        this.session.getTransaction().commit(); //事務提交后才能得到最新的值
        System.out.println(u.getId() + " Hibernate 自動刷新數據庫觸發器生成的值:" + u.getNationality());
        assertTrue( true );
    }

 13、@Temporal 時序屬性

JPA 規范要求使用 @Temporal 注解時序屬性,以聲明所映射列的准確 SQL 數據庫類型。當沒有提供時 Hibernate 會默認使用 TemporalType.TIMESTAMP。

Java時序類型 java.util.Date;、java.util.Calendar;、java.sql.Date;、java.sql.Time;、java.sql.Timestamp;

TemporalType 選項 DATE、TIME、TIMESTAMP

14、@CreationTimestamp和@UpdateTimestamp 創建時間戳和更新時間戳

當沒有提供 @Temporal 時 Hibernate 會默認使用 TemporalType.TIMESTAMP

    @Temporal(TemporalType.TIMESTAMP)
    @Column(updatable=false)
    @org.hibernate.annotations.CreationTimestamp
    protected Date createOn;
    @Temporal(TemporalType.TIMESTAMP)
    @Column(insertable=false)
    @org.hibernate.annotations.UpdateTimestamp
    protected Date updateOn;

 當執行插入時 Hibernate 自動給 createOn 賦值,當執行更新時 Hibernate 自動給 updateOn 賦值。

15、@Enumerated 枚舉類型

默認 Hibernate 會存儲 EnumType.ORDINAL 位置,這種很脆弱。EnumType.STRING 存儲枚舉值的標簽,這樣變更不會影響

    @Enumerated(EnumType.STRING)
    private Sex sex;

 16、@Embeddable 可嵌入組件

@Embeddable
public class Address {
    @NotNull
    @Column(nullable=false)
    protected String street;
    
    @NotNull
    @Column(nullable=false)
    protected String zipcode;
    
    @NotNull
    @Column(nullable=false)
    protected String city;
    
    public Address() {}
    public Address(String street,String zipcode,String city) {
        this.street = street;
        this.zipcode = zipcode;
        this.city = city;
    }
    @Override
    public String toString() {
        return "Address [street=" + street + ", zipcode=" + zipcode + ", city=" + city + "]";
    }
}

嵌入式組件

    protected Address address;

重寫嵌入式組件

    @AttributeOverrides({
        @AttributeOverride(name="street",column=@Column(name="billing_street")),
        @AttributeOverride(name="zipcode",column=@Column(name="billing_zipcode")),
        @AttributeOverride(name="city",column=@Column(name="billing_city"))
    })
    protected Address billingAddress;

 17、@Lob

二進制數據和大數據

18、@Type 類型適配器

    @org.hibernate.annotations.Type(type="yes_no")
    protected boolean verify;
    @org.hibernate.annotations.Type(type="true_false")
    protected boolean verify;

 19、@Convert 轉換器

    @Convert(converter = MoneyConverter.class,disableConversion=false)
    protected Money money;

 20、@MappedSuperclass 不持久化超類屬性

使用 @Entity 映射具體類,要想超類的屬性被忽略並且不持久化,則必須使用  @MappedSuperclass

21、@AttributeOverrides 和 @AttributeOverride 重寫屬性

子類重寫從父類繼承的字段和屬性

類重寫嵌入式字段和屬性

 22、@Inheritance 繼承策略

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 每個帶有聯合的具體類使用一個表

@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 每個類層次結構使用一個表

@Inheritance(strategy=InheritanceType.JOINED)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM