国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JPA學習(3)JPAAPI

2019-11-14 14:55:46
字體:
來源:轉載
供稿:網友

在我們的jpa的helloworld中,我們看到了簡單的一個jpa保存操作,下面就來好好學習一下,JPA最主要的幾個類

  1.基本的幾個類:

    ①: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異常.

    ③在 JPA 規范中, EntityManager 是完成持久化操作的核心對象。實體作為普通 java 對象,只有在調用 EntityManager 將其持久化后才會變成持久化對象。EntityManager 對象在一組實體類與底層數據源之間進行 O/R 映射的管理。它可以用來管理和更新 Entity Bean, 根椐主鍵查找 Entity Bean, 還可以通過JPQL語句查詢實體。 實體的狀態: 新建狀態: 新創建的對象,尚未擁有持久性主鍵。 持久化狀態:已經擁有持久性主鍵并和持久化建立了上下文環境 游離狀態:擁有持久化主鍵,但是沒有與持久化建立上下文環境 刪除狀態: 擁有持久化主鍵,已經和持久化建立上下文環境,但是從數據庫中刪除。

  下面是測試上面幾個類的:

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。第一個參數為被查詢的實體類類型,第二個參數為待查找實體的主鍵值。

  getReference (Class<T> entityClass,Object primaryKey):與find()方法類似,不同的是:如果緩存中不存在指定的 Entity, EntityManager 會創建一個 Entity 類的代理,但是不會立即加載數據庫中的信息,只有第一次真正使用此 Entity 的屬性才加載,所以如果此 OID 在數據庫不存在,getReference() 不會返回 null 值, 而是拋出EntityNotFoundException這兩個方法和hibernate中的session.get和session.load兩個方法很相似,因為代理對象的原因,所以在某些情況下,會拋出懶加載的情況,

  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 異常。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中宁县| 光泽县| 托克逊县| 昌都县| 蒙自县| 连州市| 洛南县| 中宁县| 海阳市| 淅川县| 三都| 古丈县| 莱阳市| 周至县| 遵化市| 临西县| 横山县| 饶河县| 和林格尔县| 三原县| 乌兰浩特市| 洮南市| 洛南县| 松溪县| 防城港市| 许昌县| 班玛县| 定襄县| 鞍山市| 双鸭山市| 会东县| 五华县| 道孚县| 彭水| 龙门县| 博乐市| 兴和县| 神木县| 开化县| 开封市| 太保市|