一、java
Persistence git
EntityManagerFactorygithub
二、數據庫
EntityManager#find緩存
EntityManager#getReferencesession
EntityManager#persistence測試
EntityManager#removeui
三、spa
EntityTransaction(事物)hibernate
四、EntityManager 其餘方法
五、EntityManager#merge
一、JPA相關接口/類:Persistence
.Persistence 類是用於獲取 EntityManagerFactory 實例。該類包含一個名爲 createEntityManagerFactory 的 靜態方法 。
.createEntityManagerFactory 方法有以下兩個重載版本。 帶有一個參數的方法以 JPA 配置文件 persistence.xml 中的持久化單元名爲參數 帶有兩個參數的方法:前一個參數含義相同,後一個參數 Map類型,用於設置 JPA 的相關屬性,這時將忽略其它地方設置的屬性。Map 對象的屬性名必須是 JPA 實現庫提供商的名字空間約定的屬性名。
二、EntityManagerFactory
EntityManagerFactory 接口主要用來建立 EntityManager 實例。該接口約定了以下4個方法:
<1>createEntityManager():用於建立實體管理器對象實例。
<2>createEntityManager(Map map):用於建立實體管理器對象實例的重載方法,Map 參數用於提供 EntityManager 的屬性。
<3>isOpen():檢查 EntityManagerFactory 是否處於打開狀態。實體管理器工廠建立後一直處於打開狀態,除非調用close()方法將其關閉。
<4>close():關閉 EntityManagerFactory 。 EntityManagerFactory 關閉後將釋放全部資源,isOpen()方法測試將返回 false,其它方法將不能調用,不然將致使IllegalStateException異常。
四、EntityManager
在 JPA 規範中, EntityManager 是完成持久化操做的核心對象。實體做爲普通 Java 對象,只有在調用 EntityManager 將其持久化後纔會變成持久化對象。EntityManager 對象在一組實體類與底層數據源之間進行 O/R 映射的管理。它能夠用來管理和更新 Entity Bean, 根椐主鍵查找 Entity Bean, 還能夠經過JPQL語句查詢實體。
實體的狀態: 新建狀態: 新建立的對象,還沒有擁有持久性主鍵。
持久化狀態:已經擁有持久性主鍵並和持久化創建了上下文環境
遊離狀態:擁有持久化主鍵,可是沒有與持久化創建上下文環境
刪除狀態: 擁有持久化主鍵,已經和持久化創建上下文環境,可是從數據庫中刪除。
find (Class<T> entityClass,Object primaryKey):
返回指定的 OID 對應的實體類對象,若是這個實體存在於當前的持久化環境,則返回一個被緩存的對象;不然會建立一個新的 Entity, 並加載數據庫中相關信息;若 OID 不存在於數據庫中,則返回一個 null。第一個參數爲被查詢的實體類類型,第二個參數爲待查找實體的主鍵值。
getReference (Class<T> entityClass,Object primaryKey):
與find()方法相似,不一樣的是:若是緩存中不存在指定的 Entity, EntityManager 會建立一個 Entity 類的代理,可是不會當即加載數據庫中的信息,只有第一次真正使用此 Entity 的屬性才加載,因此若是此 OID 在數據庫不存在,getReference() 不會返回 null 值, 而是拋出EntityNotFoundException
persist (Object entity):
用於將新建立的 Entity 歸入到 EntityManager 的管理。該方法執行後,傳入 persist() 方法的 Entity 對象轉換成持久化狀態。
--若是傳入 persist() 方法的 Entity 對象已經處於持久化狀態,則 persist() 方法什麼都不作。
--若是對刪除狀態的 Entity 進行 persist() 操做,會轉換爲持久化狀態。
--若是對遊離狀態的實體執行 persist() 操做,可能會在 persist() 方法拋出 EntityExistException(也有多是在flush或事務提交後拋出)。
remove (Object entity)
刪除實例。若是實例是被管理的,即與數據庫實體記錄關聯,則同時會刪除關聯的數據庫記錄。
merge (T entity):merge() 用於處理 Entity 的同步。即數據庫的插入和更新操做
EntityTransaction(事物管理)
EntityTransaction 接口用來管理資源層實體管理器的事務操做。經過調用實體管理器的getTransaction方法 得到其實例。
begin ()
----用於啓動一個事務,此後的多個數據庫操做將做爲總體被提交或撤消。若這時事務已啓動則會拋出 IllegalStateException 異常。
commit ()
----用於提交當前事務。即將事務啓動之後的全部數據庫更新操做持久化至數據庫中。
rollback ()
-----撤消(回滾)當前事務。即撤消事務啓動後的全部數據庫更新操做,從而不對數據庫產生影響。
setRollbackOnly ()
-----使當前事務只能被撤消。
getRollbackOnly ()
----查看當前事務是否設置了只能撤消標誌。
isActive ()
-----查看當前事務是不是活動的。若是返回true則不能調用begin方法,不然將拋出 IllegalStateException 異常;
若是返回 false 則不能調用 commit、rollback、setRollbackOnly 及 getRollbackOnly 方法,不然將拋出 IllegalStateException 異常。
相關測試代碼:
package com.jpa.test; import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.guigu.jpa.helloword.Customer; public class JPATest { private EntityManagerFactory entityManagerFactory; private EntityManager entityManager; private EntityTransaction transaction; @Before public void init(){ entityManagerFactory= Persistence.createEntityManagerFactory("jpa-1"); entityManager=entityManagerFactory.createEntityManager(); transaction=entityManager.getTransaction(); transaction.begin();//開啓事務 } @After public void destroy(){ transaction.commit(); entityManager.close(); entityManagerFactory.close(); } /** * 若傳入得是一個遊離狀態的對象,即傳入的對象有OID * 一、若在EntityManager緩存中有該對象 * 二、JPA會把遊離狀態的屬性複製到EntityManager緩存中的對象中 * 三、EntityManager緩存中的對象象執行update */ @Test public void testMerge4(){ Customer customer=new Customer(); customer.setAge(16); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); customer.setEmail("dd@163.com"); customer.setLastName("DD"); customer.setId(4); Customer customer2=entityManager.find(Customer.class, 4); entityManager.merge(customer); System.out.println(customer==customer2);//false } /** * 若傳入得是一個遊離狀態的對象,即穿入的對象有OID * 一、若在EntityManager緩存中沒有該對象 * 二、若在數據庫中有改記錄 * 3JPA會查詢對應的記錄,而後返回該記錄對應的一個對象,再而後會把遊離對象的屬性複製到查詢到的對象中 * 四、對查詢到的對象執行update操做 */ @Test public void testMerge3(){ Customer customer=new Customer(); customer.setAge(16); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); customer.setEmail("ee@163.com"); customer.setLastName("EE"); customer.setId(4); Customer customer2=entityManager.merge(customer); System.out.println(customer==customer2);//false } /** * 若傳入得是一個遊離狀態的對象,即穿入的對象有OID * 一、若在EntityManager緩存中沒有該對象 * 二、若在數據庫中也沒有改記錄 * 3JPA會建立一個新對象,而後把前遊離對象的屬性複製到新建立的對象中 * 四、對新建立的對象執行insert操做 */ @Test public void testMerge2(){ Customer customer=new Customer(); customer.setAge(16); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); customer.setEmail("hello@163.com"); customer.setLastName("李四"); customer.setId(100); Customer customer2=entityManager.merge(customer); System.out.println("customer#id"+customer.getId()); System.out.println("customer2#id"+customer2.getId()); } /* * 總的來講:相似於hibernate session 的saveOrUpdate方法 * 1.若傳入得是一個臨時對象則會建立一個新對象,把零時對象的屬性複製到新對象中,而後對新對象執行持久化操做 * 因此新的對象有id,可是之前的零時對象中沒有id */ @Test public void testMerge1(){ Customer customer=new Customer(); customer.setAge(16); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); customer.setEmail("hello@163.com"); customer.setLastName("李四"); Customer customer2=entityManager.merge(customer); System.out.println("customer#id"+customer.getId()); System.out.println("customer2#id"+customer2.getId()); } //相似於hibernated的delete方法,把對象對應的記錄從數據庫中移除 //但注意:該方法只能移除持久化對象,而hibernate的delete方法實際上還能夠移除遊離對象 @Test public void testRemove(){ // Customer customer =new Customer(); // customer.setId(2); Customer customer=entityManager.find(Customer.class, 2); entityManager.remove(customer); } //相似於hibernate的save方法使對象由臨時狀態轉變爲持久化狀態 //和hibernatede save方法不一樣之處:對象由id則不能執行insert操做,會拋出異常 @Test public void testPersistence(){ Customer customer=new Customer(); customer.setAge(22); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); customer.setEmail("@123456.conm"); customer.setLastName("張三"); // customer.setId(100);//hi拋出異常 entityManager.persist(customer); System.err.println(customer.getId()); } //相似於hibernate 中的session中的load方法 @Test public void testGetReference(){ Customer customer=entityManager.getReference(Customer.class, 1);//1表示id System.out.println(customer.getClass().getName()); System.out.println("-------------------------------"); // transaction.commit(); // entityManagerFactory.close(); System.out.println(customer); } //相似於hibernate 中的session中的get方法 @Test public void testFind(){ Customer customer=entityManager.find(Customer.class, 1);//1表示id System.out.println("-------------------------------"); System.out.println(customer); } }
完整 源碼地址:https://github.com/wuhongpu/JPA.git