[JavaEE - JPA] 4. EntityManager相關核心概念

前三篇文章花了一些筆墨介紹了事務的概念以及在EJB和spring Framework中分別是如何完成事務管理的。之所以花了比較大的代價來介紹事務主要也是因爲不管在什麼類型的持久化應用中,都包含下面兩個關鍵點:

  1. 事務管理
  2. 對象關係映射(ORM)

而JPA主要定義的就是和對象關係映射(ORM)相關的內容。從本篇文章開始,會系統性地介紹JPA的方方面面。

核心概念及其關聯關係

首先,當然是介紹最核心最重要的EntityManager相關概念。

在學習和使用JPA的時候,經常會碰到幾類對象:

  1. EntityManager 以及 PersistenceContext
  2. EntityManagerFactory 以及 PersistenceUnit
  3. Persistence

他們的名字也比較相似,他們之間的關聯關係可以用下面的圖進行表示:

這裏寫圖片描述

EntityManager & PersistenceContext

首先來看看EntityManager接口中的幾個典型方法的定義:

public interface EntityManager {
    public void persist(Object entity);
    public <T> T merge(T entity);
    public void remove(Object entity);
    public <T> T find(Class<T> entityClass, Object primaryKey);
    // ......
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

以上的四個方法分別實現了數據的增刪改查(CRUD)操作。它的作用就像一座橋樑,將面向對象和數據庫的世界連接起來。在沒有調用EntityManager接口中的方法是,一個Java對象就是一個內存中的存在而已,而在調用後它就會被持久到數據庫的行列結構中去。

那麼這些通過EntityManager被持久化到數據庫中的對象,以及從數據庫拉入到內存中的對象,也會同時被一個名爲持久化上下文(Persistence Context)所管理,這些被管理的對象統稱爲受管對象(Managed Object),每個受管對象都有唯一的ID。至於EntityManager和持久化上下文之間的數量關係,一般可以是多對一的,即多個EntityManager同時指向一個持久化上下文。這其實很好理解,就是EntityManager雖然有多個實例,但是它們背後的持久化上下文卻只有一個,這樣就保證了多個EntityManager所管理的受管對象擁有的ID是唯一的。

既然EntityManager只是一個接口,那麼是誰來負責實現它呢?就是實現了JPA的廠商,比如典型的EclipseLink,hibernate等。

EntityManagerFactory & PersistenceUnit

仍然還是先看看該接口提供的幾個典型方法:

public interface EntityManagerFactory {
    public EntityManager createEntityManager();
    public CriteriaBuilder getCriteriaBuilder();
    public Metamodel getMetamodel();
    // ......
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

此接口中使用的最爲頻繁的就是第一個createEntityManager(),它能夠創建並返回得到一個EntityManager接口的實現。既然是一個用於創建EntityManager接口的工廠接口,想必就會有一個用於控制如何生產的配置場所。這個配置場所就是上圖中提到的持久化單元(Persistence Unit)。典型的比如在META-INF文件夾中創建的persistence.xml文件,其中就可以定義一個或者多個持久化單元。

那麼EntityManagerFactory又是通過何種方法得到的呢?這得分兩種環境來討論。

  1. JavaEE
  2. JavaSE

在JavaEE環境下,一般通過依賴注入的方式引入:

@PersistenceUnit(unitName="unitNameDefinedInPersistenceConfig")
private EntityManagerFactory emf;
  • 1
  • 2
  • 1
  • 2

而這裏所使用的PersistenceUnit結合其unitName所代表的就是定義在META-INFpersistence.xml配置文件中的某些具體配置。這些配置可以是數據庫連接參數,也可以是其它JPA配置項,或者具體JPA實現(提供商)的配置項。

Persistence

在JavaSE環境下,可以通過Persistence類得到具體的EntityManagerFactory實現:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("unitNameDefinedInPersistenceConfig");
  • 1
  • 1

以上便是JPA中和EntityManager相關的幾個核心概念。它們定義了普通Java對象(POJO)和數據庫行記錄之間的交互方式。至於普通Java對象(POJO)中的字段和數據庫列記錄之間的映射,我們將在後續的文章中逐一介紹。

原文地址:http://blog.csdn.net/dm_vincent/article/details/52615532

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章