1. 程式人生 > >JPA學習(三、JPA_API)

JPA學習(三、JPA_API)

地方 釋放 contain 清除 枚舉 自動 中文名 異常 沒有

框架學習之JPA(三)

JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0註解或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。

Sun引入新的JPA ORM規範出於兩個原因:其一,簡化現有Java EE和Java SE應用開發工作;其二,Sun希望整合ORM技術,實現天下歸一。

學習視頻:尚矽谷框架jpa學習(有興趣的同學留言郵箱)

使用軟件:eclipse

Java版本:jdk8

本節目錄

三、JPA_API

1.Persistence

2.EntityManagerFactory

3.entityManager

4.EntityTransaction

三、JPA_API

1.Persistence

  • Persistence類是用於獲取EntityManagerFactory實例。該類包含一個名為createEntityManagerFactory的靜態方法。
  • createEntityManagerFactory方法有如下兩個重載方法
    • 帶有一個參數的方法以及JPA配置文件persistenceXmi中的持久化單元名為參數
    • 帶有兩個參數的方法:前一個參數含義相同,後一個參數Map類型,用於設置JPA的相關屬性,這時將忽略其他地方設置的屬性。Map對象的屬性名必須是JPA實現庫提供商的名字空間約定的屬性名

2.EntityManagerFactory

  • EntityManagerFactory接口主要用來創建EntityManager實例。該接口約定了如下四個方法
    • createEntityManager():用於創建實體管理器對象實例
    • createEntityManagerMap map):用於創建實體管理器對象實例的重載方法,Map參數用於提供EntityManager的屬性。
    • isOpen():檢查EntityManagerFactory是否處於打開狀態。實體管理器工廠創建後一直處於打開狀態,除非用close()方法將其關閉
    • close():關閉EntityManagerFactory
      EntityManagerFactory關閉後將釋放所有資源,isOpen()方法將返回false,其他方法將不能調用,否則將導致IllegalStateException異常

3.entityManager

實體的狀態:

1.新建狀態:新創建的狀態,尚未擁有持久性主鍵

2.持久化狀態:已經擁有持久性主鍵並和持久化建立了上下文環境

3.遊離狀態:擁有持久化主鍵,但是沒有與持久化建立上下文環境

4.刪除狀態:擁有持久化主鍵,已經和持久化建立上下文環境,但是從數據庫中刪除

  • Find()

//類似於hibernate中session的get方法

@Test

public void testFind() {

Customer customer = entityManager.find(Customer.class, 1);

System.out.println("---------------------------");

System.out.println(customer.toString());

}

  

  • GetReference()
//類似於hibernate中session的load方法

@Test

public void testGetReference() {

Customer customer = entityManager.getReference(Customer.class, 1);

//這是一個代理對象,可能會出現懶加載異常,即在使用當前customer之前就把entityManager關閉,就無法進行數據庫訪問

System.out.println(customer.getClass().getName());

System.out.println("---------------------------");

System.out.println(customer.toString());

}

  

  • Persist()
//類似於hibernate中的save方法,使對象由臨時狀態變為持久化狀態

//和hibernate的save方法的不同之處:若對象有id,則不能執行insert操作,而會拋出異常

@Test

public void testPersistence() {

Customer customer = new Customer();

customer.setAge(12);

customer.setEmail("[email protected]");

customer.setLastName("xiong");

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

 

entityManager.persist(customer);

//可以打印Id

System.out.println(customer.getId());

}

  

  • Remove()
//類似於hibernate的delete方法,把對象對應的記錄從數據庫中移除

//但註意:該方法只能移除持久化對象。二hibernate的delete方法實際上還可以移除遊離對象

@Test

public void testRemove() {

Customer customer = entityManager.find(Customer.class, 2);

entityManager.remove(customer);

}

  

  • Merge()
//若傳入的是一個遊離對象, 即傳入的對象有 OID.

//1. 若在 EntityManager 緩存中有對應的對象

//2. JPA 會把遊離對象的屬性復制到查詢到EntityManager 緩存中的對象中.

//3. EntityManager 緩存中的對象執行 UPDATE.

@Test

public void testMerge4(){

Customer customer = new Customer();

customer.setAge(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("[email protected]");

customer.setLastName("DD");

 

customer.setId(4);

Customer customer2 = entityManager.find(Customer.class, 4);

 

entityManager.merge(customer);

 

System.out.println(customer == customer2); //false

}

 

//若傳入的是一個遊離對象, 即傳入的對象有 OID.

//1. 若在 EntityManager 緩存中沒有該對象

//2. 若在數據庫中也有對應的記錄

//3. JPA 會查詢對應的記錄, 然後返回該記錄對一個的對象, 再然後會把遊離對象的屬性復制到查詢到的對象中.

//4. 對查詢到的對象執行 update 操作.

@Test

public void testMerge3(){

Customer customer = new Customer();

customer.setAge(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("[email protected]");

customer.setLastName("EE");

 

customer.setId(4);

 

Customer customer2 = entityManager.merge(customer);

 

System.out.println(customer == customer2); //false

}

 

//若傳入的是一個遊離對象, 即傳入的對象有 OID.

//1. 若在 EntityManager 緩存中沒有該對象

//2. 若在數據庫中也沒有對應的記錄

//3. JPA 會創建一個新的對象, 然後把當前遊離對象的屬性復制到新創建的對象中

//4. 對新創建的對象執行 insert 操作.

@Test

public void testMerge2(){

Customer customer = new Customer();

customer.setAge(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("[email protected]");

customer.setLastName("DD");

 

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(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("[email protected]");

customer.setLastName("CC");

 

Customer customer2 = entityManager.merge(customer);

 

System.out.println("customer#id:" + customer.getId());

System.out.println("customer2#id:" + customer2.getId());

}

  

  • SetFlushModeFlushModeType flushMode):設置持久上下文換進的Flush模式。參數可以取兩個枚舉l Flush():同步持久上下文,即將持久上下文環境所有未保存實體的狀態信息保存到數據庫中。
    • FlushModeType.AUTO為自動跟新數據庫實體
    • FlushModeType.COMMIT為直到提交事物時才更新數據庫記錄
  • getFlushMode():獲得持久上下文環境的Flush模式。返回FlushModeType的枚舉值
  • RefreshObject entity):用數據庫實體記錄的值跟新實體對象的狀態,即更新實例的屬性值
  • Clear():清除持久上下文環境,斷開所有關聯的實體。如果這是還有未提交的更新則會被撤銷
  • ContainsObject entity):判斷一個實體是否屬於當前持久上下文環境管理的實體
  • lsOpen():判斷當前實體管理器是否處於的打開狀態
  • getTransaction():返回資源層的事務對象。EntityTransaction實例可以用於開始和提交多個事務。
  • Close():關閉實體管理器,之後若調用實體管理器實例的方法或其派生的查詢對象的方法都將拋出IllegalstateException異常,除了getTransactionidOpen方法

4.EntityTransaction

  • Begin():用於啟動一個事務,此後的多個數據庫將作為整體被提交或者撤銷,若這時事務已經被啟動則會拋出異常IllegalstateException
  • commit():用於提交當前事務。即將事務啟動以後的所有數據庫更新操作持久化至數據庫中
  • Rollback():撤銷回滾操作。即撤銷事務啟動以後的的所有數據庫更新操作,從而不對數據庫產生影響。
  • setRollbackOnly():使當前事務只能被撤銷
  • getRollbackOnly():查看當前事務是否設置了只能撤銷標誌
  • lsActive():查看當前事務是否是活動的。

JPA學習(三、JPA_API)