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狀態,例如:
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);
// 設定 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");
user.setName("Justin Lin");
- 若對象屬於生命周期的Detached狀態,您可以使用EntityManager的merge()方法將對象轉至生命周期的Managed狀態,合並對象上之變更:
//
若
user
狀態有所變動
entityManager.merge(user);
entityManager.merge(user);
- 也可以先使用merge()方法將Detached狀態的Entity實例轉至Managed的狀態,再更新對象,在交易確認之后,對象的更新就會反應至數據表之中:
User user1 = entityManager.merge(user);
user1.setName("Justin Lin");
user1.setName("Justin Lin");
若要刪除數據表中的數據,則對象必須是在Managed的狀態,例如用EntityManager的find()方法查找對象,以查找到的對象配合remove()方法來移除,或是使用merge(()方法將Entity處於Managed狀態再用remove()移除,移除之后,對象對應不到數據表格中實際的數據,處於Removed狀態:
User user = entityManager.find(User.class, id);
entityManager.remove(user);
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 生命周期 中再作進一步的說明。