在咱們的jpa的helloworld中,咱們看到了簡單的一個jpa保存操做,下面就來好好學習一下,JPA最主要的幾個類java
1.基本的幾個類:sql
①:Persistence 類是用於獲取 EntityManagerFactory 實例。該類包含一個名爲 createEntityManagerFactory 的 靜態方法 。 createEntityManagerFactory 方法有以下兩個重載版本。 帶有一個參數的方法以 JPA 配置文件 persistence.xml 中的持久化單元名爲參數 咱們前面META-INF下配置了一個persistence.xml的name即這個參數:數據庫
<persistence-unit name="jpa-1" transaction-type="RESOURCE_LOCAL">
。帶有兩個參數的方法:前一個參數含義相同,後一個參數 Map類型,用於設置 JPA 的相關屬性,這時將忽略其它地方設置的屬性(配置文件中設置的)。Map 對象的屬性名必須是 JPA 實現庫提供商的名字空間約定的屬性名。例如:緩存
Map<String,Object> map=new HashMap<String,Object>(); map.put("hibernate.show_sql", true); factory=Persistence.createEntityManagerFactory("jpa-1",map);
②EntityManagerFactory:EntityManagerFactory 接口主要用來建立 EntityManager 實例。該接口約定了以下4個方法: createEntityManager():用於建立實體管理器對象實例。 createEntityManager(Map map):用於建立實體管理器對象實例的重載方法,Map 參數用於提供 EntityManager 的屬性。 isOpen():檢查 EntityManagerFactory 是否處於打開狀態。實體管理器工廠建立後一直處於打開狀態,除非調用close()方法將其關閉。 close():關閉 EntityManagerFactory 。 EntityManagerFactory 關閉後將釋放全部資源,isOpen()方法測試將返回 false,其它方法將不能調用,不然將致使IllegalStateException異常.session
③在 JPA 規範中, EntityManager 是完成持久化操做的核心對象。實體做爲普通 Java 對象,只有在調用 EntityManager 將其持久化後纔會變成持久化對象。EntityManager 對象在一組實體類與底層數據源之間進行 O/R 映射的管理。它能夠用來管理和更新 Entity Bean, 根椐主鍵查找 Entity Bean, 還能夠經過JPQL語句查詢實體。 實體的狀態: 新建狀態: 新建立的對象,還沒有擁有持久性主鍵。 持久化狀態:已經擁有持久性主鍵並和持久化創建了上下文環境 遊離狀態:擁有持久化主鍵,可是沒有與持久化創建上下文環境 刪除狀態: 擁有持久化主鍵,已經和持久化創建上下文環境,可是從數據庫中刪除。app
下面是測試上面幾個類的:學習
package com.hotusm.common.test; 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.hotusm.commom.entity.User; public class TestAPI { EntityManagerFactory factory; EntityManager em; EntityTransaction et; @Before public void init(){ factory=Persistence.createEntityManagerFactory("jpa-1"); em=factory.createEntityManager(); et=em.getTransaction(); et.begin(); } @Test public void save(){ User user=new User(); user.setDesc("man"); user.setName("hotusm"); em.persist(user); } @After public void destory(){ et.commit(); em.close(); factory.close(); } }
2持久化的幾個方法:對於持久化的操做都是使用EntityManager 進行的測試
find (Class<T> entityClass,Object primaryKey):返回指定的 OID 對應的實體類對象,若是這個實體存在於當前的持久化環境,則返回一個被緩存的對象;不然會建立一個新的 Entity, 並加載數據庫中相關信息;若 OID 不存在於數據庫中,則返回一個 null。第一個參數爲被查詢的實體類類型,第二個參數爲待查找實體的主鍵值。spa
getReference (Class<T> entityClass,Object primaryKey):與find()方法相似,不一樣的是:若是緩存中不存在指定的 Entity, EntityManager 會建立一個 Entity 類的代理,可是不會當即加載數據庫中的信息,只有第一次真正使用此 Entity 的屬性才加載,因此若是此 OID 在數據庫不存在,getReference() 不會返回 null 值, 而是拋出EntityNotFoundException這兩個方法和hibernate中的session.get和session.load兩個方法很類似,由於代理對象的緣由,因此在某些狀況下,會拋出懶加載的狀況,hibernate
persist (Object entity):用於將新建立的 Entity 歸入到 EntityManager 的管理。該方法執行後,傳入 persist() 方法的 Entity 對象轉換成持久化狀態。 若是傳入 persist() 方法的 Entity 對象已經處於持久化狀態,則 persist() 方法什麼都不作。 若是對刪除狀態的 Entity 進行 persist() 操做,會轉換爲持久化狀態。 若是對遊離狀態的實體執行 persist() 操做,可能會在 persist() 方法拋出 EntityExistException(也有多是在flush或事務提交後拋出)。
remove (Object entity):刪除實例。若是實例是被管理的,即與數據庫實體記錄關聯,則同時會刪除關聯的數據庫記錄。
merge (T entity):merge() 用於處理 Entity 的同步。即數據庫的插入和更新操做,這個方法就和hibernate中的sesson.saveOrUpdate方法類似,可是也有些許不一樣的地方,若是保存的是一個臨時對象的話,那麼在持久化之前,EntityManager會先建立一個先的對象,再將這個遊離對象的屬性拷貝到新的對象中去,最後持久化這個新建立的對象。若是是遊離對象的話,那麼又是另外的一種操做,下面是具體的圖:
EntityManager其餘的幾個方法:
refresh (Object entity):用數據庫實體記錄的值更新實體對象的狀態,即更新實例的屬性值。 clear ():清除持久上下文環境,斷開全部關聯的實體。若是這時還有未提交的更新則會被撤消。 contains (Object entity):判斷一個實例是否屬於當前持久上下文環境管理的實體。 isOpen ():判斷當前的實體管理器是不是打開狀態。 getTransaction ():返回資源層的事務對象。EntityTransaction實例能夠用於開始和提交多個事務。 close ():關閉實體管理器。以後若調用實體管理器實例的方法或其派生的查詢對象的方法都將拋出 IllegalstateException 異常,除了getTransaction 和 isOpen方法(返回 false)。不過,當與實體管理器關聯的事務處於活動狀態時,調用 close 方法後持久上下文將仍處於被管理狀態,直到事務完成。
createQuery (String qlString):建立一個查詢對象。
createNamedQuery (String name):根據命名的查詢語句塊建立查詢對象。參數爲命名的查詢語句。
createNativeQuery (String sqlString):使用標準 SQL語句建立查詢對象。參數爲標準SQL語句字符串。
createNativeQuery (String sqls, String resultSetMapping):使用標準SQL語句建立查詢對象,並指定返回結果集 Map的 名稱。
3EntityTransaction
EntityTransaction 接口用來管理資源層實體管理器的事務操做。經過調用實體管理器的getTransaction方法 得到其實例。
begin () 用於啓動一個事務,此後的多個數據庫操做將做爲總體被提交或撤消。若這時事務已啓動則會拋出 IllegalStateException 異常。 commit () 用於提交當前事 務。即將事務啓動之後的全部數據庫更新操做持久化至數據庫中。 rollback () 撤消(回滾)當前事務。即撤消事務啓動後的全部數據庫更新操做,從而不對數據庫產生影響。 setRollbackOnly () 使當前事務只能被撤消。 getRollbackOnly () 查看當前事務是否設置了只能撤消標誌。
isActive () 查看當前事務是不是活動的。若是返回true則不能調用begin方法,不然將拋出 IllegalStateException 異常;若是返回 false 則不能調用 commit、rollback、setRollbackOnly 及 getRollbackOnly 方法,不然將拋出 IllegalStateException 異常。