JPA核心類與使用(二)
點擊訪問:JPA環境配置(一)
Persistence:
Persistence用於獲取EntityManagerFactory實例,這個類中包含一個名為createEntityManagerFactory的靜態方法。
這個方法有兩個重載的版本:
1)帶有一個參數的方法以JPA配置文件中的持久化單元名為參數。
<persistence-unit name="JpaDemo1" transaction-type="RESOURCE_LOCAL">
就是這個JpaDemo1
2)帶有兩個參數的方法:第一個參數和第一種版本一樣,第二個參數傳下去的是個Map集合,這個集合可以用來設置JPA的配置。
EntityManagerFactory:
這個接口主要是用來創建EntityManager實例對象,這個接口中約束了4個方法。
createEntityManager():用於創建實體管理器對象的實例
createEntityManager(Map map):map參數用於提供EntityManager的屬性
isOpen():用來檢測EntityManagerFactory對象是否關閉,在工廠打開之後除非調用close()才會關閉
close():上面也說了,關閉工廠用的,關閉之後在使用拋出異常IllegalStateException
EntityManager:
在JPA規範中,ENtityManager是完成持久化操作的核心對象,實體作為普通Java對象,只有在調用EntityManager將它與數據庫互交後變成持久化對象。EntityManager對象在一組實體類與底層數據源之間進行O/R映射的管理。它可以用來管理和更新Entity Bean,根據主鍵查找Entity Bean,還可以通過JPQL語句查詢實例。
實體的狀態分為:
1)新建狀態:新創建的對象,還沒擁有持久化主鍵
2)持久化狀態:已經擁有持久性主鍵和持久化建立了上下文環境
3)遊離狀態:擁有持久化主鍵,但是沒有與持久化建立上下文環境
4)刪除狀態:擁有持久化主鍵,已經和持久化建立上下文,但是數據庫的已經被刪除。
現在測試下這個類中的方法如何使用。
find(Class<T> entityClass , Object primaryKey)
第一個參數 entityClass是持久化類的class對象,第二個參數是主鍵ID,同hibernate種get()方法,一旦執行立即加載,立馬發送語句
//獲取持久化對象,立即發送sql語句,沒有查到對應的數據返回nullStudent student = entityManager.find(Student.class, 1); System.out.println(student);
getReference(Class<T> entityClass , Object primaryKey)
第一個參數 entityClass是持久化類的class對象,第二個參數是主鍵ID。同hibernate中load()方法,即使執行使用才加載,使用才發送語句
@Test public void test3(){ //獲取持久化對象,延遲加載使用才發送sql語句,沒有查詢到對應於的數據拋出異常 Student student = entityManager.getReference(Student.class,1); System.out.println(student); }
persist(Object entity)
用於將新建對象納入到EntitiyManager的管理,該方法執行後這個對象將變成持久化對象。如果對已經處於持久化的對象進行管理那麽這個方法什麽都不會做,將刪除狀態的對象傳入會將這個對象給持久化。如果將遊離狀態的對象傳入可以拋出異常。
//將新建對象轉換為持久化對象 Student student = new Student("AA", "AA-00", 11, "13212341234", "中國-未知-未知"); entityManager.persist(student);
remove(Object entity)
刪除實例,只能刪除持久化對象同Hibernate。
@Test public void test5(){ //刪除一個持久化對象,數據庫對應記錄會對應刪除 Student student = entityManager.find(Student.class,1); entityManager.remove(student); }
createQuery(String hqString)
創建一個查詢對象
@Test public void createQuery(){ //創建一個查詢對象 String hql = "from Student"; Query query = entityManager.createQuery(hql); List<Student> students = query.getResultList(); for (Student student : students) { System.out.println(student); } }
createNamedQuery(String nameString)
根據命名的查詢語句塊創建查詢對象。參數為命名的查詢語句。
createNativeQuery (String sqlString):
使用標準 SQL語句創建查詢對象。參數為標準SQL語句字符串。
@Test public void createNativeQuery(){ //使用標準 SQL語句創建查詢對象。參數為標準SQL語句字符串。 String sql = "select * from tal_student"; Query query = entityManager.createNativeQuery(sql,Student.class); List<Student> students = query.getResultList(); for (Student student : students) { System.out.println(student); } //createNativeQuery (String sqls, String resultSetMapping) //使用標準SQL語句創建查詢對象,並指定返回結果集 Map的 名稱。 }
merge(T entity)
同HIbernate saveOrUpdate方法,用於持久化對象同步如果沒有就Insert 如果有就執行update
flush()
同步持久上下環境意思就是將持久上下文所有沒有保存的數據更新到數據庫
refresh()
用於更新實體記錄的數據
contains(Object entity)
判斷一個對象是否是持久化對象
isOpen()
判斷實體管理器是否打開
getTransaction()
返回資源層事務對象。
close()
關閉這個實體管理器
EntityTransaction
接口用來管理資源層實體管理器的事務操作。通過調用實體管理器的getTransaction方法 獲得其實例。
這裏面有幾個常用的方法和hibernate中Transaction都是一樣的。
Begin()啟動一個事務,如果這個事物已經啟動拋出一個異常
commit()提交一個事物,提交之後將增刪改操作更新至數據庫
rollback()回滾一個數據,回滾後所有的操作將失效。
註意我上面那些操作代碼使用的是單元測試,@Before中就已經初始化工廠與實體管理器,在@After中對事物進行過提交與資源關閉,沒提交事務,上面那些增刪改操作都是失效操作。
JPA核心類與使用(二)