JPA 基礎 — 1

WuFeng Chiang
4 min readJun 4, 2017

--

The Java Persistence API (JPA) is a Java application programming interface specification that describes the management of relational data in applications using Java Platform, Standard Edition and Java Platform, Enterprise Edition. (資訊來源:Java Persistence API, wikipedia)

簡言之,JPA 是一個 Java 界定義出來對 persistence 進行處理的標準協定。在 Java 裡用 interface、在商業界可能用 contract、在科幻劇裡可能用 protocol … 不論是哪個字,共同的精神就是:這是個大家都認同的規則,在規則內要怎麼做?則是各家本領。

就像棒球規則,就是單一跑者能跑完四個壘包就能得一分。至於想怎麼得分?就看各家本領:打全壘打、保送盜壘加安打、安打失誤加暴投…都行。

制定 JPA 的結果,就是讓寫 Java 程式的人,能用比較公認合適的"故事"來掌握從 Java 程式到硬碟、資料庫…等儲存體內儲存的數位資料。

JPA 這個故事裡的角色,最基礎來說,有:

  1. Entity: 在一般的使用上,Entity 做為一個資料表在 RAM 裡的形體。Java 程式藉由和 Entity 互動,來進行資料表內資料的存取。
  2. EntityManager: 在這裡,manager 用「管理器」來形容。照字義來說,"它是用來管理 Entity 的",但是這個說法有點缺漏,這個我後面說明。
  3. PersistenceContext: 它就是一堆 entities 的集合。換句話說,它存在於記憶體中,是一堆 entities 的容器,而且 entities 之間不會重複。

EntityManager 其實就是一個能從 PersistenceContext 中取得 entity,並對其狀態進行變更的角色。(變更:新增、刪除、修改某個 entity)

4. EntityManagerFactory:
用來生產 EntityManager。在 JPA 中,EntityManagerFactory 是一個 interface,所以它其實是抽象的。對應到 Abstract Factory Pattern 的話,它就是 AbstractFactory 的角色,也就是說,它可能有很多種實作類別,每個實作類別的目的就是產生一種 EntityManager。

5. PersistenceUnit:
在 JPA 的定義裡,這個角色只是一個載具。它會從一個設定檔 (persistence.xml) 中,取得自己的設定 (也就是說,一個 persistence.xml 中,可以定義多個 persistence unit 哦),然後被 EntityManagerFactory 存取,讓 EntityManagerFactory 知道:要生產出什麼樣的 EntityManager 才能和 PersistenceContext 中的 entities 合作無間。

前面說過:PersistenceContext 就是 Set<Entity>,這裡要再補充說明:
(1) 它被 PersistenceUnit 生成。(規範這麼說,但是我沒看到有人照著做)
(2) 它受 EntityManager 的管理。(這倒是真的)

6. Persistence:
用來生成 EntityManagerFactory。(規範這麼說)

https://stackoverflow.com/questions/17031971/what-exactly-is-a-persistence-in-jpa-how-is-it-connected-to-entitymanagerfactor

對 Java 程式設計師來說, 對 "使用哪個 EntityManagerFactory” 會決定自己的生活幸福指數。

這個,我們再聊。

--

--