1. 程式人生 > >JPA (Java Persistence API)概述

JPA (Java Persistence API)概述

在ORM的概念大行其道之際,JavaEE平臺也不得不做出適當調整,直接在平臺層提供了物件/關係對映機制JPA,並結合了其重要的Entity JavaBean。JPA概括起來包括如下3個部分:

  • 物件/關係對映元資料及API
  • Java物件查詢語言
  • Java Criteria查詢API 
1. Entity

JPA 中的Entity是一種可持久化的域物件。一個Entity類對應關係資料庫中的一張表,一個Entity例項對應關係資料庫中的表的一行記錄。

一個Entity類的定義,需要遵守如下規則:

  • 由@javax.persistence.Entity標註
  • 至少擁有一個public或protected的、無引數的建構函式
  • 不能是final的類,也不能包含任何final的方法或可持久化的類變數
  • 可持久化的類變數不能是public的,只能被Entity類中的方法直接訪問(可以通過getter方法被應用間接訪問)
  • 可以繼承自任何類(Entity類或非Entity類),也可以被任何類繼承
  • 必要情況下實現Serializable介面
Entity例項的持久化就是對其中類變數或屬性的持久化。根據表現形式,可以分為持久化欄位(Persistent Fields)和持久化屬性(Persistent Properties)。

1)持久化欄位

Entity類中的可持久化的類變數也被稱為持久化欄位。持久化欄位的持久化標註是定義在類變數上的。通常,持久化欄位將被儲存到對應的資料庫中,除非以下情況:

  • 持久化欄位同時被@javax.persistence.Transient標註
  • 持久化欄位同時被Java關鍵字transient修飾
2)持久化屬性

持久化屬性的持久化標註是定義在類變數的getter方法上的。持久化屬性都必須擁有getter/setter方法。如果類變數被如下定義,則不能在該類變數的getter方法上設定持久化標註,即這樣的類變數不可能同時是持久化屬性:

  • 類變數被@javax.persistence.Transient標註
  • 類變數被Java關鍵字transient修飾

2. Entity Relationship

Entity和Entity之間的關係稱為Entity Relationship,Entity關係的表示是通過Entity類中的關係欄位或關係屬性。Entity關係的型別(用以修飾關係欄位或關係屬性的標註)如下:

  • @javax.persistence.OneToOne
  • @javax.persistence.OneToMany
  • @javax.persistence.ManyToOne
  • @javax.persistence.ManyToMany

1)Entity關係的方向性

Entity關係具有方向性,一個Entity關係所涉及的雙方Entity,必然有一個owning方,另外還可以有一個inverse方。

Entity關係的定義可以是單向的,也可以是雙向的:

  • 單向,相互關聯的兩個Entity只有一個通過關係標註引用對方

             擁有標註的這個Entity被稱為關係的owning方(對應資料庫的表中有外來鍵)

  • 雙向,相互關聯的兩個Entity都通過關係標註彼此互相引用對方

             其中一個Entity是關係的owning方,另一個Entity是關係的inverse方(標註中帶有mappedBy)。

注意:

OneToOne的關係中,對應資料庫的表中有外來鍵的是owning方;

OneToManyManyToOne的關係中,多方必須是owning方(外來鍵必須在多方);

ManyToMany的關係中,任意一方都可以是owning方(兩方都有外來鍵);

Entity Relationships的方向性決定了在查詢時從一個Entity是否可以訪問關聯的Entity。


2)Entity關係的級聯操作Cascade

3. Entity類的繼承

Entity類支援類的繼承和多型。Entity類(@javax.persistence.Entity標註修飾)與非Entity類(沒有任何持久化標註修飾)之間可以互相繼承。

Entity類可以是抽象類,也可以是具體類。抽象Entity類可以被用於查詢語句,也可以被EntityManager管理。但因為抽象類不能被例項化,所以查詢語句中查詢的物件如果是抽象Entity類,則事實上是對該抽象Entity類的所有具體類的查詢。

非Entity類中定義的任何持久化欄位或持久化屬性都將被忽略。即使是非Entity類被Entity類繼承了,但是在非Entity類中包含的任何持久化欄位或持久化屬性仍將被忽略。非Entity類不能被用於查詢語句,也不能被EntityManager管理。

有一種特殊的非Entity類被稱為Mapped Superclass(@javax.persistence.MappedSuperclass標註修飾),其中也可以包含持久化欄位或持久化屬性。Mapped Superclass往往定義通用的持久化欄位或持久化屬性,並被Entity類繼承。Mapped Superclass可以是抽象類,也可以是具體類。Mapped Superclass因為不是Entity,所以不能被用於查詢語句,也不能被EntityManager管理。

對於一組有繼承關係的Entity類,他們與資料庫中的表之間的對映策略可以配置。其中處於繼承關係頂端的根Entity類必須使用@javax.persistence.Inheritance標註。具體的對映策略如下:

  • 整個繼承關係的Entity類一起對應資料庫中的一個表(預設)

             @javax.persistence.Inheritance(strategy=”javax.persistence.InheritanceType.SINGLE_TABLE”)

  • 每個具體的Entity類對應資料庫中的一個表(不推薦)

             @javax.persistence.Inheritance(strategy=”javax.persistence.InheritanceType.TABLE_PER_CLASS”)

  • “join”策略,通用父Entity類和具體子Entity類都對應資料庫中的一個表,使用時連線起來

             @javax.persistence.Inheritance(strategy=”javax.persistence.InheritanceType.JOINED”)


4. 對Entity的管理EntityManager

javax.persistence.EntityManager物件負責管理位於同一資料庫中的所有Entity。

一個EntityManager物件就對應一個持久化上下文(persistencecontext),即一個特定的資料儲存,所有該資料儲存中的Entity例項都由對應的EntityManager物件管理。事實上,持久化上下文實現對Entity例項的具體操作,而javax.persistence.EntityManager介面中定義的方法只是用於與持久化上下文互動。

  • Container-Managed Entity Manager

在JTA事務中往往要訪問持久化上下文,這時只要將該持久化上下文對應的EntityManager注入到應用中即可。對於JavaEE容器管理的EntityManager,無需在應用類之間傳遞EntityManager,JavaEE容器負責EntityManager的生命週期管理,並且在整個JTA事務中可用。

@javax.persistence.PersistenceContext
EntityManager em;

  • Application-Managed Entity Manager

由於javax.persistence.EntityManager的例項不是執行緒安全的,為了執行緒安全地控制對資料庫的訪問,應用可以使用javax.persistence.EntityManagerFactory建立一個特有的EntityManager並關聯一個獨立的持久化上下文(稱為持久化單元)。持久化單元的定義位於persistence.xml 檔案中。

通過EntityManagerFactory建立的EntityManager,必須嵌入到事務操作的開始和結束之間才能夠加入事務,即應用管理的EntityManager只能在應用管理的事務中使用。應用必須EntityManager及其持久化上下文的生命週期。

@javax.persistence.PersistenceUnit
EntityManagerFactory emf;
EntityManager em = emf.createEntityManager();

5. EntityManager對Entity的生命週期管理

Entity例項有如下4種狀態:

  • new,沒有與持久化上下文關聯,也沒有持久標識
  • managed,與持久化上下文關聯,也有持久標識
  • detached,沒有與持久化上下文關聯,但因為曾經關聯過,所以有持久標識
  • removed,與持久化上下文關聯,也有持久標識,將被定期從資料庫中刪除

 Entity例項中的資料與資料庫中資料進行同步的發生:

  • Entity例項所在的事務被提交
  • 或者呼叫了EntityManager的flush()

6. 對Entity的查詢

JPA提供如下2種查詢Entity的方法:

  • Java Persistence query language (JPQL),類似於SQL

              查詢結果需要進行型別轉換

  • Criteria API, 一組Java API

              型別安全

              執行效能高

              程式設計複雜


7. JPA的鎖機制

  • 樂觀鎖(預設)

資料庫的表中有version列(Entity類中的欄位或屬性使用@javax.persistence.Version標註),應用只能讀取不能修改。

事務提交時申請short-termlock,失敗則丟擲javax.persistence.OptimisticLockException異常並回滾事務。

  • 悲觀鎖,適合於資料變化特別頻繁的資料庫

事務在建立的時候就開始持有long-termlock,直至事務結束。

JPA提供的鎖模式:

  • javax.persistence.LockModeType.OPTIMISTIC
  • javax.persistence.LockModeType.OPTIMISTIC_FORCE_INCREMENT
  • javax.persistence.LockModeType.PESSIMISTIC_READ
  • javax.persistence.LockModeType.PESSIMISTIC_WRITE
  • javax.persistence.LockModeType.PESSIMISTIC_FORCE_INCREMENT
  • javax.persistence.LockModeType.READ(不建議使用,等價於OPTIMISTIC)
  • javax.persistence.LockModeType.WRITE(不建議使用,等價於OPTIMISTIC_FORCE_INCREMENT)
  • javax.persistence.LockModeType.NONE

8. JPA的二級快取

二級快取是在JavaEE伺服器上對一個持久化上下文中Entity的本地儲存,對於應用來說是透明的。

JPA提供的快取模式:

  • ALL,快取持久化上下文中的所有Entity
  • NONE,不緩衝任何Entity
  • ENABLE_SELECTIVE,只快取@javax.persistence.Cacheable標註的Entity
  • DISABLE_SELECTIVE,只不快取@javax.persistence.Cacheable(false)標註的Entity
  • UNSPECIFIED,使用JavaEE伺服器的預設設定

1)快取的Retrieval Mode,用於在呼叫EntityManager.find()方法時,控制資料從快取中讀取還是從資料庫中讀取。

JPA提供了2種RetrievalMode:

  • javax.persistence.CacheRetrieveMode.USE

             優先讀取快取,如果快取再沒有再讀取資料庫

  • javax.persistence.CacheRetrieveMode.BYPASS

             無論何時都直接讀取資料庫

2)快取的Store Mode,用於控制資料在快取中的儲存。

JPA提供了2種StoreMode:

  • javax.persistence. CacheStoreMode.BYPASS

             對資料庫的任何操作,都不改變快取

  • javax.persistence.CacheStoreMode.USE

             對資料庫中資料的讀寫將導致在快取中同步建立或修改資料

             如果快取中已有該資料,則對該資料的後續讀操作將不會重新整理快取

  • javax.persistence. CacheStoreMode.REFRESH

             對資料庫中資料的讀寫將導致在快取中同步建立或修改資料

             如果快取中已有該資料,則對該資料的後續讀操作仍然會重新整理快取


相關推薦

JPA (Java Persistence API)概述

在ORM的概念大行其道之際,JavaEE平臺也不得不做出適當調整,直接在平臺層提供了物件/關係對映機制JPA,並結合了其重要的Entity JavaBean。JPA概括起來包括如下3個部分: 物件/關係對映元資料及APIJava物件查詢語言Java Criteria查詢A

JPA(Java Persistence APIJava持久化API)

一、什麼是JPA 物件關係對映ORM(Object-Relation Mapping)是用來將物件和物件之間的關係對應到資料庫中表與表之間的關係的一種模式。ORM框架能夠將Java物件對映到關係資料庫,能夠直接持久化複雜的Java物件。ORM框架的出現,使開發者從資料庫程式

Java課筆記-API概述

imp 有用 network output java.net all cat 工具 tput   collection of APIs(Application Programming Interface) java.lang automatically impo

Java永續性APIJPA)第7講——實體生命週期及生命週期回撥方法

em.createQuery("delete from Ordertable o where o.orderid = ?1").setParameter(1,orderid).executeUpdate();

JAVA HDFS API Client 連接HA

pac ack lis address provider port server default file 如果Hadoop開啟HA,那麽用Java Client連接Hive的時候,需要指定一些額外的參數 package cn.itacst.hadoop.hdfs;

第一章 java程序設計概述

.cn 發布 線程 字節 做了 ges 運行時 依賴 images Java 的設計者已經編寫了頗有影響力的“ 白皮書”, 用來解釋設計的初衷以及完成的情況,並且發布了一個簡短的摘要, 這個摘要用下面11 個關鍵術語進行組織:1 ) 簡單性2 ) 面向對象3 ) 分布式4

Java常用API

寫入 大小 移動 是否 格式化 分行 查詢語句 boolean del 常用Java API 一、 java.io.BufferedReader類(用於從文件中讀入一段字符;所屬套件:java.io) 1、 構造函數BufferedReader(java.io.Fil

JavaAPI下載

api html ava down tps javase jin oracl .com 如何從官網下載java API JavaSE9 http://www.oracle.com/technetwork/java/javase/downloads/jdk9-download

java zip API實現壓縮和解壓縮zip包

nal reel ++ 不能 length dir fileinput color rgs package zip; import java.io.BufferedInputStream; import java.

Java程序API數據接口

inter 屬性 strong tomcat resp 中間 平臺 過程 使用 API:應用程序接口(API:Application Program Interface) 一、使用數據接口的作用 1、封裝邏輯 數據接口從數據庫查

API概述

api1.1 API概念API(Application Programming Interface) : 應用程序編程接口編寫一個機器人程序去控制機器人踢足球,程序就需要向機器人發出向前跑、向後跑、射門、搶球等各種命令,沒有編過程序的人很難想象這樣的程序如何編寫。但是對於有經驗的開發人員來說,知道機器人廠商一

第1章 API概述

Java1.1 API概念API(Application Programming Interface) : 應用程序編程接口編寫一個機器人程序去控制機器人踢足球,程序就需要向機器人發出向前跑、向後跑、射門、搶球等各種命令,沒有編過程序的人很難想象這樣的程序如何編寫。但是對於有經驗的開發人員來說,知道機器人廠商

Java設計模式概述

學習 寫代碼 多個 抽象工廠 bili 支持 tor 常用 叠代器模式 設計模式概述 1. 設計模式是什麽 我們在平時編寫代碼的過程中,會遇到各種各樣的問題,細想一下很多問題的解決思路大致一樣的,這時候你就可以把解決問題的思路整理清晰,成為一種解決問題的核心模式,以後你就能

摘:JAVA JXL API的詳細使用

sets pro 行合並 t對象 [] 它的 3.2 etime wcf 轉自:http://www.cr173.com/html/10377_1.html 1 開發調研1.1 需求描述MS的電子表格(Excel)是Office的重要成員,是保存統計數據的一種常用格式。作為

上屏API-概述

API1.概述 1.1.用途及閱讀方法 上屏API是上屏系統的後臺接口,管理平臺界面實現需要遵循本接口規範。 1.2.通信協議 客戶端和服務器通過HTTP協議通信,客戶端使用HTTP GET方法或POST方法向服務器發送請求,服務器返回json格式的業務數據或操作結果給客戶端。盡管接口同時支持GET和POST

hadoop學習筆記(七):Java HDFS API

on() apr name pin package 目錄 except 讀取 play 一、使用HDFS FileSystem詳解 HDFS依賴的第三方包:   hadoop 1.x版本:   commons-configuration-1.6.jar   comm

4.28 java常用api

split ins nta nal 變量作用域 stat 索引 轉換 sub String處理: String str = ".............."; *str.equals(); // 比較兩個字符串的值是否相等 == 除基礎數據類型之外, 比較兩個變量指向的地

[java]Stream API——reduce

聚合操作 得到 span 用戶 red item 計算 integer 循環 聚合操作reduce T reduce(T identity, BinaryOperator accumulator) 代碼: int value = Stream.of(1, 2, 3, 4)

[java]Stream API——collect

求和 pin -s mil toc tor 最大 api system 一、R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner) supplier:一個能創造目標類型實例的方法。

Java語言API,Object類、StringBuilder、Date時間獲取、System類常用

調用 mil obj 賦值 .com byte app 種類型 結束程序 Object類Java.lang.Object(類):是Java中任何“引用類型”的父類。包括自定義的類、類庫中的類、數組 都繼承了toString()和equals()方法 1.toString方法