1. 程式人生 > >JPA——JPA註解

JPA——JPA註解

[email protected]

@Entity標註用於實體類宣告語句之前,指出該Java類為實體類,將對映到指定的資料庫表。

[email protected]

當實體類與其對映的資料庫表名不同名時,需要使用@Table標註說明,該標註與@Entity標註並列使用,置於實體類宣告語句之前,可寫於單獨語句行,也可與宣告語句同行。

@Table標註的常用選項是name,用於指明資料庫的表名。

@Table標註還有一個兩個選項catalog和schema用於設定表所屬的資料庫目錄或模式,通常為資料庫名。uniqueConstraints選項用於設定約束條件,通常不須設定。

[email protected]

@Id標註用於宣告一個實體類的屬性對映為資料庫的主鍵列。該屬性通常置於屬性宣告語句之前,可與宣告語句同行,也可寫在單獨行上。

@id標註也可置於屬性的getter方法之前。

[email protected]

@GeneratedValue用於標註主鍵的生成策略,通過strategy屬性指定。預設情況下,JPA自動選擇一個最合適底層資料庫的主鍵生成策略:SqlServer對應identity,MySQL對應auto increment

在java.persistence.GenerationType中定義了一下幾種可供選擇的策略:

--IDENTITY:採用資料庫ID自增長的方式來自增主鍵欄位,Oracle不支援這種方式;

--AUTO:JPA自動選擇合適的策略,是預設選項;

--SEQUENCE:通過序列產生主鍵,通過@SequenceGenertor註解指定序列名,MySql不支援這種方式,Oracle可以使用;

--TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於資料庫移植。

在使用TABLE主鍵生成策略的時候,則需要一個屬性generator(生成器),這個屬性對應另一個註解——@TableGenerator,這個註解中的name屬性值與generator屬性值相對應,@TableGenerator還有一個屬性table,用於指定生成主鍵對應的表,在確定了對應的表之後,則需要確定通過屬性pkColumnName、pkColumnValue、valueColumnName確定唯一的值,還可以通過屬性allocationSize設定增長幅度,例如:

@TableGenerator(name="ID_GENERATOR",table="jpg_id_generators",
                pkColumnName="PK_NAME",
                pkColumnValue="CUSTOMER_ID",
                valueColumnName="PK_VALUE",
                allocationSize=100)
@GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR")
@Id
public Integer getId(){
    return id;
}

[email protected]

@Basic表示一個簡單的屬性到資料庫表的欄位的對映,對於沒有任何標註的getXxxx()方法,預設即位@Basic。

--fetch:表示該屬性的讀取策略,有EAGER和LAZY兩種,分別表示主支抓取和延遲載入,預設為EAGER。

--optional:表示該屬性是否允許為null,預設為true。

[email protected]

當實體的屬性與其對映的資料庫表的列不同名時需要使用@Column標註說明,該屬性通常置於實體的屬性宣告語句之前,還可與@Id標註一起使用。

@Column標註的常用屬性是name,用於設定對映資料庫表的列名。此外,該標註還包含其他多個屬性,如:unique、nullable、length等。

@Column標註的columnDefinition屬性:表示該欄位在資料庫中的實際型別。通常ORM框架可以根據屬性型別自動判斷資料庫中欄位的型別,但是對於Date型別仍然無法確定資料庫中欄位型別究竟是DATE、TIME還是TIMESTAMP。此外,String的預設對映型別為VARCHAR,也可將String型別對映到特定資料庫的BLOB或TEXT欄位型別。

@Column標註也可置於屬性的getter方法之前。

[email protected]

表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性。

如果一個屬性並非資料庫的欄位對映,就務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic。

[email protected]

在核心的Java API中並沒有定義Date型別的精度(temporal precision)。而在資料庫中,表示Date型別的資料有DATE、TIME和TIMESTAMP三種精度(即單純的日期、時間或者兩者兼備)。在進行屬性對映時可使用@Temporal註解來調整精度。

例如:

@Temporal(TemporalType.TIMESTAMP)
public Date getCreatedTime(){
    return createTime;
}