1. 程式人生 > >《Hibernate快速開始 – 4 – 使用JAVA持久層 API (JPA)教程》

《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事件管理器。