《Hibernate快速開始 – 4 – 使用JAVA持久層 API (JPA)教程》
章節目標
- 使用JPA EntityManagerFactory
- 使用註解提供對映資訊
- 使用 JPA 介面
本教程可在 entitymanger/ 路徑下下載
4.1. persistence.xml
之前的章節使用了hibernate原生的配置檔案hibernate.cfg.xml。然而,JPA中定義了不同的的自助配置檔案persistence.xml。這個啟動過程在JPA文件裡面有詳細定義。在JAVA SE環境中,持久層的提供者(在此為hibernate)是根據路徑MEATA-INF/persistence.xml找到所有JPA配置檔案的前提。
案例 10. persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="org.hibernate.tutorial.jpa"> ... </persistence-unit> </persistence>
persistence.xml檔案應為每個“persistent unit”提供一個唯一值。當程式得到javax.persistence.EntityManangerFactory的定義是要通過這個值去找到配置檔案。
有關設定的定義已包括在Hibernate配置檔案的章節中。 以javax.persistence為字首的元素可在需要的時候使用。需要注意的是,其餘的Hibernate相關的設定名稱現在都以hibernate.為字首。
另外,元素依舊與2.1.Hibernate配置檔案的章節中描述的一樣。
4.2. 註解過的實體類
這裡的實體與2.1.Hibernate配置檔案的章節中描述的一樣
4.3. 程式碼例項
之前的教程使用的是hibernate原生介面,這個章節使用的是JPA介面
案例 11. 使用javax.persistence.EntityManagerFactory
protected void setUp() throws Exception { sessionFactory = Persistence.createEntityManagerFactory( "org.hibernate.tutorial.jpa" ); }
注意,此處的持久層名稱“org.hibernate.tutorial.jpa”與persistence.xml中一致。
案例 12. 儲存(有持久屬性)實體
EntityManager entityManager = sessionFactory.createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist( new Event( "Our very first event!", new Date() ) ); entityManager.persist( new Event( "A follow up event", new Date() ) ); entityManager.getTransaction().commit(); entityManager.close();
程式碼與之前儲存實體的章節中一樣。javax.persistence.EntityManager介面替換了org.hibernate.Session介面。JPA中將這個操作稱作“persist”,有別於“save”。
案例 13. 獲得實體集合
entityManager = sessionFactory.createEntityManager(); entityManager.getTransaction().begin(); List<Event> result = entityManager.createQuery( "from Event", Event.class ).getResultList(); for ( Event event : result ) { System.out.println( "Event (" + event.getDate() + ") : " + event.getTitle() ); } entityManager.getTransaction().commit(); entityManager.close();
此處程式碼與之前的獲得實體集合相似。
4.4. 更進一步
練習
- 配置一個ELB Session Bean來研究容器管理持久層的用法,包括stateless和stateful兩種情況。
- 用CDI為基礎注入的監聽器來配置一個JMS事件管理器。