進階:使用 EntityManager


JPA中要對數據庫進行操作前,必須先取得EntityManager實例,這有點類似JDBC在對數據庫操作之前,必須先取得Connection實例,EntityManager是JPA操作的基礎,它不是設計為線程安全(Thread-safe)。

EntityManager實例基本上是從EntityManagerFactory上調用createEntityManager()方法來取得,在  第一個  JPA (單機客戶端) 中有看到實際的例子,若您使用容器管理,則可以使用@PersistenceContext注入EntityManger,像是 第一個  JPA (容器管理) 所示范的,或者您可以使用@PersistenceUnit注入EntityManagerFactory,再用它來建立EntityManager,如   Servlet  中直接使用  JPA 所示范的。

EntityManager主要在管理Entity實例生命周期,透過EntityManager,您對Entity實例的操作,可以對應至數據庫進行新增、查找、修改、刪除、重清等動作,以下先簡介API的使用,以Application-Managed EntityManager為例作說明,您必須搭配  Entity  生命周期 以對Entity在EntityManager中的Managed、Detached、Removed狀態獲得更進一步的了解。

要新增資料,可以使用EntityManager的persist()方法,這也會讓Entity實例處於Managed狀態,例如:
User user = new User();
// 
設定  user  相關屬性
entityManager.persist(user);

若要取得數據表中的數據,使用EntityManager的find()方法,指定主鍵對象與Class實例來取得對應的數據並封裝為對象,查找回的對象會處於Managed的狀態:
User user = entityManager.find(User.class, id);

若數據庫中已有對應數據,則要修改數據有幾種方式:

 

  • 若對象是在Managed狀態,例如查找對象之后,直接更新對象,在交易確認之后,對象的更新就會反應至數據表之中:
User user = entityManager.find(User.class, id);
user.setName("Justin Lin");

 

  • 若對象屬於生命周期的Detached狀態,您可以使用EntityManagermerge()方法將對象轉至生命周期的Managed狀態,合並對象上之變更:
//   user  狀態有所變動
entityManager.merge(user);

 

  • 也可以先使用merge()方法將Detached狀態的Entity實例轉至Managed的狀態,再更新對象,在交易確認之后,對象的更新就會反應至數據表之中:
User user1 = entityManager.merge(user);
user1.setName("Justin Lin");

若要刪除數據表中的數據,則對象必須是在Managed的狀態,例如用EntityManager的find()方法查找對象,以查找到的對象配合remove()方法來移除,或是使用merge(()方法將Entity處於Managed狀態再用remove()移除,移除之后,對象對應不到數據表格中實際的數據,處於Removed狀態:
User user = entityManager.find(User.class, id);
entityManager.remove(user);

若在加載某個Entity實例之后,而數據表格因另一個操作而發生變動,您可以使用EntityManager的refresh()方法,將數據表格的更動加載Entity實例中,若Entity先前有了一些更動操作,則會被覆蓋:
entityManager.refresh(user);

您可以使用EntityManager的flush()方法,強制EntityManager中管理的所有Entity對應的數據表格與Entity的狀態同步:
entityManager.flush();

EntityManager的clear()方法,可以將EntityManager所管理的Entity實例清除,使Entity處於Detached狀態:
entityManager.clear();

每個EntityManager都與一個  Persistence Context 關聯,EntityManager不直接維護Entity,而是將之委托給Persistence Context,Persistence Context中會維護一組Entity實例,每個Entity在Persistence Context為Managed狀態,Entity實例會有Managed、Detached、Removed狀態,這在  Entity 生命周期 中再作進一步的說明。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM