JPA基礎(四)之JPA 的 API

標準查詢結構

該標準與 JPQL 是密切相關的,並允許使用類似的操作符在他們的查詢設計。
它遵循 javax.persistence.criteria 包設計一個查詢。查詢結構指的語法條件查詢。

從第一個 jpa 案例中,我使用到的幾個基本的 jpa 的 API 類:

  • Persistence:主要作用就是通過它的靜態方法createEntityManagerFactory 獲取EntityManagerFactory (相當於 Hibernate 的 SessionFactory)
  • EntityManagerFactory :主要作用就是獲取 EntityManager 的實例對象,EntityManager 相當於 Hibernate 的 Session
  • EntityManager 操作數據庫的方法:主要作用就是操作數據庫,執行增刪改查,對應的方法 persist(增),find 和 getReferenc(查一條記錄),remove (刪),merge(改)
  • EntityManager 的 createQuery(),createNamedQuery(), createNativeQuery()這些方法也和 hibernate 裏的方法非常類似,我們講 jpql 查詢的時候會具體使用的,到時
    再講
    ⑤EntityTransaction:jpa 裏的事務管理,begin(),commit(),rollback()等等常用方
    法和 hibernate 裏也是一樣的

find 方法
find (Class entityClass,Object primaryKey):返回指定的 OID 對應的實體類對象。
第一個參數爲被查詢的實體類類型,第二個參數爲待查找實體的主鍵值。
如果這個實體存在於當前的持久化環境,則返回一個被緩存的對象;否則會創建一個新的 Entity, 並加載數據庫中相關信息;若 OID 不存在於數據庫中,則返回一個 null。

getReference 方法
getReference (Class entityClass,Object primaryKey) 與 find()方法類似。
不同的是:如果緩存中不存在指定的 Entity, EntityManager 會創建一個 Entity 類的代理,但是不會立即加載數據庫中的信息,只有第一次真正使用此 Entity 的屬性才加載,所以如果此 OID 在數據庫不存在,getReference() 不會返回 null 值, 而是拋出EntityNotFoundException。

persist 方法
persist (Object entity):用於將新創建的 Entity 納入到 EntityManager 的管理。該方法執行後,傳入 persist() 方法的 Entity 對象轉換成持久化狀態。
如果傳入 persist() 方法的 Entity 對象已經處於持久化狀態,則 persist() 方法什麼都不做。如果對刪除狀態的 Entity 進行 persist() 操作,會轉換爲持久化狀態。如果對遊離狀態的實體執行 persist() 操作,可能會在 persist() 方法拋出EntityExistException(也有可能是在 flush 或事務提交後拋出)。

remove 方法
remove (Object entity):刪除實例。
如果實例是被管理的,即與數據庫實體記錄關聯,則同時會刪除關聯的數據庫記錄。

merge 方法
merge (T entity):merge() 用於處理 Entity 的同步。即數據庫的插入和更新操作。
原理圖如下:
在這裏插入圖片描述
flush 方法
顧名思義,強制刷新。同步持久上下文環境,即將持久上下文環境的所有未保存實體的狀態信息保存到數據庫中。

refresh 方法
refresh (Object entity):用數據庫實體記錄的值更新實體對象的狀態,即更新實例的屬性值。即,刷新內存中對象的屬性。

clear 方法
clear ():清除持久上下文環境,斷開所有關聯的實體。如果這時還有未提交的更新則會被撤消。

contain()方法
判斷一個實例是否屬於當前持久上下文環境管理的實體。

isOpe()方法
判斷當前的實體管理器是否是打開狀態。

getTransaction()
返回資源層的事務對象。EntityTransaction 實例可以用於開始和提交多個事務。

close 方法
關閉實體管理器。之後若調用實體管理器實例的方法或其派生的查詢對象的方法都將拋出 IllegalstateException 異常,除了 getTransaction 和 isOpen 方法(返回 false)。不過,當與實體管理器關聯的事務處於活動狀態時,調用 close 方法後持久上下文將仍處
於被管理狀態,直到事務完成。

createQuery 方法
createQuery (String qlString):創建一個查詢對象。
createNamedQuery (String name):根據命名的查詢語句塊創建查詢對象。參數爲命名
的查詢語句。

createNativeQuery 方法-1
createNativeQuery (String sqlString):使用標準 SQL 語句創建查詢對象。參數爲標準 SQL 語句字符串。

createNativeQuery 方法-2
createNativeQuery (String sqls, String resultSetMapping):使用標準 SQL 語句創建查詢對象,並指定返回結果集 Map 的 名稱。

實體的狀態

在 JPA 中實體對象的狀態分爲一下四種狀態

  1. 新建狀態: 新創建的對象,尚未擁有持久性主鍵;
  2. 持久化狀態: 已經擁有持久性主鍵並和持久化建立了上下文環境;
  3. 遊離狀態: 擁有持久化主鍵,但是沒有與持久化建立上下文環境;
  4. 刪除狀態: 擁有持久化主鍵,已經和持久化建立上下文環境,但是從數據庫中刪除。

代碼:

@Test
public void test3() {
	// EntitymanagerFactory
	EntityManagerFactory factory = 
		Persistence.createEntityManagerFactory("jpademo");
	// MyBatis---SqlSession JPA --- EntityManager
	EntityManager entityManager = factory.createEntityManager();
	EntityTransaction tx = entityManager.getTransaction();
	
	tx.begin();
	
	Customer customer = new Customer();
	customer.setName("小飛飛");
	customer.setTelephone("1354356765");
	System.out.println("初始化狀態.. 新建狀態 在內存中存在 但是在數據庫中沒有對應記錄");
	entityManager.persist(customer);
	System.out.println("持久狀態.....");
	
	tx.commit();
	// 清除 entityManager 中的緩存
	entityManager.clear();
	System.out.println("遊離狀態-- customer 對象從 entityManager 管理中移除");
	
	tx.begin();
	customer.setName("小豬佩奇");
	entityManager.merge(customer);
	System.out.println("持久狀態....");
	tx.commit();
	
	tx.begin();
	entityManager.remove(entityManager.merge(customer));
	System.out.println("刪除狀態");
	tx.commit();
	
	System.out.println(customer);
}

更多JPA相關知識請點擊此處

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