1. 程式人生 > >JPA常見註解及使用

JPA常見註解及使用

首先了解幾個概念

Spring Data:
一個用於簡化資料庫訪問,並支援雲服務的開源框架,根據JPA規範封裝的一套JPA應用框架。
主要目標:是使得構建基於 Spring 框架應用對資料的訪問變得方便快捷,
**JPA:**全稱Java Persistence API,是sun提出的一個物件持久化規範
pom.xml依賴

 <!--spring data jpa-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.6.4.RELEASE</version>
        </dependency>
JPA常用註解

@Entity
@Table
@Basic
@Column
@GeneratedValue
@Id
@Transient
@Temporal
@OneToMany
@ManyToOne
@ManyToMany
@Query (Spring Data JPA 用法)
@Modifying

JPA常用註解的使用說明

圖片.png
1、@Entity 標註用於實體類宣告語句之前,指出該Java 類為實體類,將對映到指定的資料庫表。如宣告一個實體類 OperatingLog,它將對映到資料庫中的 MH_OPERATING_LOG表上。

2、@Table

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

@Table 標註的常用選項是 name,用於指明資料庫的表名 @Table標註還有一個兩個選項 catalog 和 schema 用於設定表所屬的資料庫目錄或模式,通常為資料庫名。

uniqueConstraints 選項用於設定約束條件,通常不須設定。如下程式碼:

@Table(name="MH_OPERATING_LOG")//主要是JPA_MH_OPERATING_LOG"對映表名對應的資料庫表名JPA_MH_OPERATING_LOG預設情況下可以不寫表名與持久化類名相同
@Entity //表明這是一個持久化類 
public class OperatingLog extends IdEntity {
}

3、@Id

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

 @Id
 @Column(name = "USER_Id") //定義資料庫的列名如果與欄位名一樣可以省略
 @GeneratedValue(strategy=GenerationType.AUTO)
 private String userId; //定義主鍵,生成主鍵的策略AUTO自動的根據資料的型別生成主鍵

@Id標註也可置於屬性的getter方法之前
圖片.png

4、@GeneratedValue
@GeneratedValue 用於標註主鍵的生成策略,通過 strategy 屬性指定。預設情況下,JPA 自動選擇一個最適合底層資料庫的主鍵生成策略:SqlServer 對應 identity,MySQL 對應 auto increment。 在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:

IDENTITY:採用資料庫 ID自增長的方式來自增主鍵欄位,Oracle 不支援這種方式;
AUTO: JPA自動選擇合適的策略,是預設選項;
SEQUENCE:通過序列產生主鍵,通過 @SequenceGenerator 註解指定序列名,MySql 不支援這種方式
TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於資料庫移植。

5、@Basic

@Basic 表示一個簡單的屬性到資料庫表的欄位的對映,對於沒有任何標註的 getXxxx() 方法,預設即為
@Basic fetch: 表示該屬性的讀取策略,有 EAGER 和 LAZY 兩種,分別表示主支抓取和延遲載入,預設為 EAGER.
optional:表示該屬性是否允許為null, 預設為true
6、@Column
當實體的屬性與其對映的資料庫表的列不同名時需要使用@Column 標註說明,該屬性通常置於實體的屬性宣告語句之前,還可與 @Id 標註一起使用。
@Column 標註的常用屬性是 name,用於設定對映資料庫表的列名。此外,該標註還包含其它多個屬性,如
:unique 、nullable、length
等。
@Column 標註的 columnDefinition 屬性: 表示該欄位在資料庫中的實際型別.通常 ORM 框架可以根據屬性型別自動判斷資料庫中欄位的型別,但是對於Date型別仍無法確定資料庫中欄位型別究竟是DATE,TIME還是TIMESTAMP.此外,String的預設對映型別為VARCHAR, 如果要將 String 型別對映到特定資料庫的 BLOB 或TEXT 欄位型別.
@Column標註也可置於屬性的getter方法之前

下面再給一個簡單的例子
圖片.png

7 [email protected]

表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性.
如果一個屬性並非資料庫表的欄位對映,就務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic
//工具方法,不需要對映為資料表的一列
圖片.png

8、@Temporal

在核心的 Java API 中並沒有定義 Date 型別的精度(temporal precision). 而在資料庫中,表示 Date 型別的資料有 DATE, TIME, 和 TIMESTAMP 三種精度(即單純的日期,時間,或者兩者 兼備).

在進行屬性對映時可使用@Temporal註解來調整精度.
圖片.png

圖片.png

9.@OneToMany
指向多的那方的pojo的關聯外來鍵欄位
圖片.png

10.@ManyToOne
設定在“一方”pojo的外來鍵欄位上
圖片.png

11.@ManyToMany

圖片.png

12.@Query註解的用法(Spring Data JPA)
舉幾個栗子

1.普通查詢
圖片.png

2.使用@Param註解注入引數
圖片.png

13.@modifying
在@Query註解中編寫JPQL實現DELETE和UPDATE操作的時候必須加上@modifying註解,以通知Spring Data 這是一個DELETE或UPDATE操作。
UPDATE或者DELETE操作需要使用事務,此時需要 定義Service層,在Service層的方法上新增事務操作。

2.這個比較特殊沒有@Query註解

List<IndexName> findByIndexNameLike(String IndexName);

圖片.png

主要原因是:JpaRepository的查詢 直接在介面中定義查詢方法,如果是符合規範的,可以不用寫實現,目前支援的關鍵字寫法如下:

圖片.png

圖片.png

這裡我們定義的DAO介面需要繼承 PagingAndSortingRepository 和 JpaSpecificationExecutor
圖片.png

PagingAndSortingRepository繼承關係

JpaSpecificationExecutor介面

JpaSpecificationExecutor