2010年9月15日 星期三

使用Hibernate的JPA實作來 由DDL產生Domain Object

JPA是Java的Persistent標準,針對這個標準,不同單位有不同的實作方式,而Hibernate提供了其中一種實作的選擇。Hibernate是透過Hibernate Annotations(包含hibernate-annotations.jar、hibernate-commons- annotations.jar與ejb3-persistence.jar這些jar)和 Hibernate EntityManager(包含hibernate-entitymanager.jar這個jar) 這兩個component來進行實作。

為了免除尋找這些jar的麻煩,可以直接到Jboss Tools下載Jboss的Tool pakcage,裡面就直接包含了所有Jboss的工具,包含Hibernate。下載網址:http://www.jboss.org/tools/download  (請注意不同版本的Jboss Tool需搭配不同的eclipse版本)  如下圖,可選擇Download: 下面的下載連結,把整個 package的zip下載後並解開後,再用Eclipse的add new site功能,把整個package安裝到eclipse中

image

安裝完後,開始下列步驟

  1. 打開eclipse,新增一個JPA project,填上專案名稱後按下一步
    image
  2. 設定產生的程式碼要放在那個目錄下,按下一步
    image
  3. 在JPA Facet對話框的上半部,先設定platform為Hibernate,然後在JPA Implementation中,設定Type為User Library。然後點選紅色框框處,以設定User Library
     image
  4. 新增一個User Library Entry,為其名命後按Add Jar,到下列目錄把所有的jar檔加到這個User Library Entry下
    \eclipse\plugins\org.hibernate.eclipse_3.3.1.v201006011046R-H111-GA\lib\hibernate\*.jar
    \eclipse\plugins\org.hibernate.eclipse_3.3.1.v201006011046R-H111-GA\lib\tools\*.jar
    \eclipse\plugins\org.hibernate.eclipse_3.3.1.v201006011046R-H111-GA\lib\annotations\*.jar
    image
  5. 加完之後,回到JPA Facet對話框,勾選剛才新建的User Library
    image
  6. 在JPA Facet對話框中間,點選 Add Connections
    image
  7. 此時會打開Database設定對話框,設定connection名稱後,按下一步
    image
  8. 在下一個對話框中,點選如下圖的圖示
    image
  9. 在New Driver Definition處,選定資料庫為IBM Data Server Driver for JDBC後,點選 Jar List的tab
    image
  10. 按下clear all後,重新指定db2 driver的位置
    image
  11. 完成後,回到設定資料庫連結對話框。完成後,按下finish
    image
  12. 回到JPA Facet,勾選下圖的設定後,按finish
    image
  13. 完成後,回到File—>New—>Others ,找到 JPA下的Entities From Tables
    image
  14. 一直按下一步,到下列對話框可以選擇要將那些Table Mapping成Entity。勾選完畢後,uncheck 同步class到persistence.xml,按下一步 
    image
  15. 對話框中會列出這些Table之間的association的關係
    image
  16. 填上產生的Code要到那個package下,按完成。即自動建立這些所需的class
    image
  17. 到此完成Domain class的建立。如前所述Hibernate是透過EntityManager這個Component來實作JPA的persistence。建立一個Utility class來取得EntityManager。若仔細看的話,可以發現EntityManager的角色類似Hibernate本身的Session

    package test.puli.util;

    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;

    public class JPAUtil {
        private static EntityManagerFactory entityManagerFactory;
        static {
            try {
                entityManagerFactory =
                    Persistence.createEntityManagerFactory("Test"); //對應至persistence.xml中的persistent unit
            }
            catch(Throwable ex) {
                throw new ExceptionInInitializerError(ex);
            }
        }
        public static EntityManagerFactory getEntityManagerFactory() {
            return entityManagerFactory;
        }
        public static void shutdown() {
            getEntityManagerFactory().close();
        }
    }

     

  18. 再建立Test的class來進行測試

    import java.util.List;
    import javax.persistence.*;
    import test.puli.model.*;
    import test.puli.util.JPAUtil;

    public class PuliTest {
        public static void main(String[] args) {
            EntityManager newEntityManager =
            JPAUtil.getEntityManagerFactory().createEntityManager();
            EntityTransaction newEtx = newEntityManager.getTransaction();
            newEtx.begin();
            PatientBasicInfo patient = (PatientBasicInfo) newEntityManager.find(PatientBasicInfo.class, "12345");
            System.out.println(patient.getPatientfirstname());
            System.out.println(patient.getPatientlastname());
            System.out.println(patient.getPatientaddress());
            newEtx.commit();
            newEntityManager.close();
            JPAUtil.shutdown();
        }
    }

  19. 修改persistence.xml如下

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" 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_1_0.xsd">
        <persistence-unit name="Test">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
                <properties>
                    <property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver"/>
                    <property name="hibernate.connection.password" value="db2admin"/>
                    <property name="hibernate.connection.url" value="jdbc:db2://localhost:50000/puli"/>
                    <property name="hibernate.connection.username" value="db2admin"/>
                    <property name="hibernate.default_schema" value="db2admin"/>
                    <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"/>

                </properties>
        </persistence-unit>
    </persistence>

  20. 執行上述的class
     

沒有留言:

張貼留言