1. 程式人生 > >JPA基礎知識(一):簡介、基本註解

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)
      :這是持久化操作中很重要的一個方面,通過面向物件而非面向資料庫的查詢語言查詢資料,避免程式和具體的 SQL 緊密耦合。

三、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 型別的資料有 DATETIMETIMESTAMP 三種精度(即單純的日期,時間,或者兩者 兼備).在進行屬性對映時可使用@Temporal註解來調整精度.