JPA基礎知識(一):簡介、基本註解
JPA基礎知識(一):簡介、基本註解
一、簡介
JPA全稱Java Persistence API,用於物件持久化。
JPA通過JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。
sun公司定義了JDBC介面,程式設計師可以通過介面來訪問資料庫,統一了java應用程式訪問資料庫的標準。
JPA統一了java應用程式使用各個ORM框架的方式。
二、JPA和Hibernate的關係
-
JPA 是 hibernate 的一個抽象(就像JDBC和JDBC驅動的關係)
- JPA 是規範:JPA 本質上就是一種 ORM 規範,不是ORM 框架 —— 因為 JPA 並未提供 ORM 實現,它只是制訂了一些規範,提供了一些程式設計的 API 介面,但具體實現則由 ORM 廠商提供實現
- Hibernate 是實現:Hibernate 除了作為 ORM 框架之外,它也是一種 JPA 實現
從功能上來說, JPA 是 Hibernate 功能的一個子集
- JPA 包括 3方面的技術
- ORM 對映元資料:主要是使用註解的方式來進行對映。
JPA 支援 XML 和 JDK 5.0 註解兩種元資料的形式,元資料描述物件和表之間的對映關係,框架據此將實體物件持久化到資料庫表中。 - JPA 的 API:用來操作實體物件,執行CRUD操作,框架在後臺完成所有的事情,開發者從繁瑣的 JDBC和 SQL程式碼中解脫出來。
- 查詢語言(JPQL)
- ORM 對映元資料:主要是使用註解的方式來進行對映。
三、JPA 基本註解
JPA 基本註解:@Entity, @Table, @Id, @GeneratedValue,@Column, @Basic,@Transient, @Temporal, 用 table 來生成主鍵詳解
1-1、@Entity
@Entity 標註用於實體類宣告語句之前,指出該Java 類為實體類,將對映到指定的資料庫表。如宣告一個實體類 Customer,它將對映到資料庫中的 customer 表上。
1-2、@Table
當實體類與其對映的資料庫表名不同名時需要使用 @Table 標註說明,該標註與 @Entity 標註並列使用,置於實體類宣告語句之前,可寫於單獨語句行,也可與宣告語句同行。
@Table 標註的常用選項是 name,用於指明資料庫的表名
@Table 標註還有一個兩個選項 catalog 和 schema 用於設定表所屬的資料庫目錄或模式,通常為資料庫名。uniqueConstraints 選項用於設定約束條件,通常不須設定。
1-3、@Id
@Id 標註用於宣告一個實體類的屬性對映為資料庫的主鍵列。該屬性通常置於屬性宣告語句之前,可與宣告語句同行,也可寫在單獨行上。
@Id 標註也可置於屬性的getter方法之前。
1-4、@GeneratedValue
@GeneratedValue 用於 標註主鍵的生成策略 ,通過 strategy 屬性指定。預設情況下,JPA 自動選擇一個最適合底層資料庫的主鍵生成策略:SqlServer 對應 identity,MySQL 對應 auto increment。
- 在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
- IDENTITY:採用資料庫 ID自增長的方式來自增主鍵欄位,Oracle 不支援這種方式;
- AUTO: JPA自動選擇合適的策略,是預設選項;
- SEQUENCE:通過序列產生主鍵,通過 @SequenceGenerator 註解指定序列名,MySql 不支援這種方式
- TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於資料庫移植。
1-5、@Basic
@Basic 表示一個簡單的屬性到資料庫表的欄位的對映,對於沒有任何標註的 getXxxx() 方法,預設即為@Basic
fetch: 表示該屬性的讀取策略,有 EAGER 和 LAZY 兩種,分別表示主支抓取和延遲載入,預設為 EAGER.
optional: 表示該屬性是否允許為null, 預設為true
1-6、@Column
當 實體的屬性與其對映的資料庫表的列不同名時 需要使用@Column 標註說明,該屬性通常置於實體的屬性宣告語句之前,還可與 @Id 標註一起使用。
- @Column 標註的常用屬性是 name,用於設定對映資料庫表的列名。此外,該標註還包含其它多個屬性,如:unique 、nullable、length等。
- @Column 標註的 columnDefinition 屬性: 表示該欄位在資料庫中的實際型別. 通常 ORM 框架可以根據屬性型別自動判斷資料庫中欄位的型別,但是對於Date型別仍無法確定資料庫中欄位型別究竟是DATE,TIME還是TIMESTAMP。此外,String的預設對映型別為VARCHAR, 如果要將 String 型別對映到特定資料庫的 BLOB 或TEXT 欄位型別.
- @Column 標註也可置於屬性的getter方法之前
1-7、@Transient
表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性.
- 如果一個屬性並非資料庫表的欄位對映,就務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic
1-8、@Temporal
在核心的 Java API 中並沒有定義 Date 型別的精度(temporal precision). 而在資料庫中,表示 Date 型別的資料有 DATE,TIME 和 TIMESTAMP 三種精度(即單純的日期,時間,或者兩者 兼備).在進行屬性對映時可使用@Temporal註解來調整精度.