隨筆-67  評論-522  文章-0  trackbacks-0
              目前,JPAJava Persistence API)的使用范圍越來越廣,作為Java EE 5.0平臺標準的ORM規范,得到了諸如:HibernateTopLinkOpenJpaORM框架的支持,同時還是EJB 3.0的重要組成部分。JPA的宗旨是為POJO提供持久化標準規范。它能夠脫離容器獨立運行,方便開發和測試。本文將通過一個小實例來說明如何在Hibernate中使用JPA,來達到簡化編程的目的。
              開發環境  Eclipse 3.3.1  MyEclipse 6.0.1GA  Tomcat 6.10  SQL Server 2000 
                      hibernate-3.2.5.GA  hibernate-annotations-3.3.0.GA
                      ejb3-persistence  hibernate-commons-annotations-3.0.0.GA
              本文是讓大家了解一下相比與以前的Hibernate ORM映射的不同之處,以及采用JPA所帶來的好處。
              為了保證程序能順序運行,避免不同的Eclipse版本之間產生錯誤,大象強烈建議,下載源碼后,按源碼中的工程名,自己單獨新建同一個工程,再將srcWEB-INF/lib目錄下的所有文件COPY至對應的目錄下。
              1、創建Web Project
                 點擊"File"->"New",選擇"Web Project",在"Project Name"中輸入ajax,點擊"Finish"。下載本文后面需要用到的JAR包,加入到WEB-INF/lib目錄下,在ajax工程中,文本采用的是UTF-8編碼。
              2、創建HibernateSessionFactory
                 傳統的方法就是在工程名上點右鍵,選擇”MyEclipse”->”Add Hibernate Capabilities”,然后就是按照提示一步一步做,不過在MyEclipse 6.0.1中添加Hibernate還是只能支持3.1,除非你選擇” Add Spring Capabilities”,里面才有Hibernate 3.2的類庫,要想完全兼容JPA,必須采用3.2以上版本。
              
                 這里大家直接使用源碼中的HibernateSessionFactory,注意請先建包:com.ajax.core,HibernateSessionFactory中有一個地方需要改動,原來的寫法是:
              private static Configuration configuration = new Configuration();
                 修改后為:
              private static AnnotationConfiguration configuration = new AnnotationConfiguration();
                 因為我們采用的是JPA注釋方式來映射實體,另外AnnotationConfiguration這個類在hibernate-annotations.jar這個包中。
              3、創建BaseDao
                 在com.ajax.core包下面新建BaseDao抽象類,里面定義的是持久化操作方法,有一點特別要注意,一定要在增加、刪除、修改這幾個方法中加入事務控制,不管是在BaseDao基類方法中加,還是在業務方法中加,一定要加事務控制,大象覺得在基類中加會比較好一點,這樣做代碼顯得更少更簡潔。如果不加事務控制,那么增、刪、改這些操作都不會產生效果,因為默認情況下,它不會進行自動提交。在做這個例子的時候,這個問題曾經困擾了我好長時間。因此,請大家記住不要再犯和大象一樣的錯誤!貼出部分代碼,詳情請看源碼,里面有很全面的注釋。
          /**
           * 抽象Dao類,用于持久化操作
           * @author 菠蘿大象
           * @version 1.0
           */
          public abstract class BaseDao<T> {

              
          private static Log log = LogFactory.getLog(BaseDao.class);
              
              
          /**
               * 獲取Hibernate的Session對象
               */

              
          public Session getSession(){
                  
          return HibernateSessionFactory.getSession();
              }
              
              
          /**
               * 根據主鍵得到對象
               */

              
          public T getObject(Class clazz, Serializable id){
                  
          return (T)getSession().get(clazz, id);
              }
              
              
          /**
               * 保存對象
               */

              
          public void saveObject(T t) {
                  Session session 
          = getSession();
                  Transaction tx 
          = beginTransaction(session);
                  
          try{
                      session.saveOrUpdate(t);
                      tx.commit();
                  }
          catch(Exception e){
                      tx.rollback();
                      log.error(
          "保存對象失敗");
                  }
              }
              
              
          /**
               * 創建事務
               */

              
          private Transaction beginTransaction(Session session){
                  
          return session.beginTransaction();
              }
          }
              4、創建Employee
                 在com.ajax.employee.mode包下新建Employee類,這個就是POJO類,下面來詳細說明里面的含義。
          @Entity
          @Table(name 
          = "EMPLOYEE")
          public class Employee implements java.io.Serializable{
              
              
          private Integer employee_id; //人員ID(主鍵)
              private String employee_name; //人員姓名
              private String sex; //性別
              private String birthday; //出生日期
              private String address; //地址
              
              @Id
              @Column(name 
          = "EMPLOYEE_ID")
              @TableGenerator(
                   name
          ="tab-store",
                   table
          ="GENERATOR_TABLE",
                   pkColumnName 
          = "G_KEY",
                   pkColumnValue
          ="EMPLOYEE_PK",
                   valueColumnName 
          = "G_VALUE",
                   allocationSize
          =1
              )
              @GeneratedValue(strategy 
          = GenerationType.TABLE,generator="tab-store")
              
          public Integer getEmployee_id() {
                  
          return employee_id;
              }
              
          public void setEmployee_id(Integer employee_id) {
                  
          this.employee_id = employee_id;
              }

          }
                 其它幾個屬性的gettersetter省略,這里我們要用到ejb3-persistence.jar,JPA的注解類就在這個包中,下面詳細說明上面使用到的注解。
                @Entity通過@Entity注解將一個類聲明為一個實體bean
                @Table通過 @Table注解可以為實體bean映射指定表,name屬性表示實體所對應表的名稱,如果沒有定義 @Table,那么系統自動使用默認值:實體的類名(不帶包名)
                @Id用于標記屬性的主鍵
                @Column表示持久化屬性所映射表中的字段,如果屬性名與表中的字段名相同,則可以省略@Column注解,另外有兩種方式標記,一是放在屬性前,另一種是放在getter方法前,例如:
              @Column(name = "EMPLOYEE_NAME")
              
          private String employee_name;
                 或者
              @Column(name = "EMPLOYEE_NAME")
              
          public String getEmployee_name() {
                  
          return employee_name;
              }
                 這兩種方式都是正解的,根據個人喜好來選擇。大象偏向于第二種,并且喜歡將屬性名與字段名設成一樣的,這樣可以省掉@Column注解,使代碼更簡潔。
                @TableGenerator表生成器,將當前主鍵的值單獨保存到一個數據庫表中,主鍵的值每次都是從指定的表中查詢來獲得,這種生成主鍵的方式是很常用的。這種方法生成主鍵的策略可以適用于任何數據庫,不必擔心不同數據庫不兼容造成的問題。大象推薦這種方式管理主鍵,很方便,集中式管理表的主鍵,而且更換數據庫不會造成很大的問題。各屬性含義如下:
                  name表示該表主鍵生成策略的名稱,這個名字可以自定義,它被引用在@GeneratedValue中設置的"generator"值中
                  table表示表生成策略所持久化的表名,說簡單點就是一個管理其它表主鍵的表,本例中,這個表名為GENERATOR_TABLE
                  pkColumnName表生成器中的列名,用來存放其它表的主鍵鍵名,這個列名是與表中的字段對應的
                  pkColumnValue實體表所對應到生成器表中的主鍵名,這個鍵名是可以自定義滴
                  valueColumnName表生成器中的列名,實體表主鍵的下一個值,假設EMPLOYEE表中的EMPLOYEE_ID最大為2,那么此時,生成器表中與實體表主鍵對應的鍵名值則為3
                  allocationSize表示每次主鍵值增加的大小,例如設置成1,則表示每次創建新記錄后自動加1,默認為50
              
                @GeneratedValue定義主鍵生成策略,這里因為使用的是TableGenerator,所以,主鍵的生成策略為GenerationType.TABLE生成主鍵策略的名稱則為前面定義的tab-store
                 這里大象想說下,網上有很多文章寫的是strategy = GenerationType.AUTO或是strategy = GenerationType.SEQUENCE,采用SEQUENCE序列是因為Oracle數據中不支持identity自動增長,要想使用它,還得在數據庫中創建一個序列,如果要更換數據庫,那將是一個非常麻煩的事情。SEQUENCE生成方式我們暫且不談,這里說下采用AUTOIDENTITY的生成方式,本例采用的是SQL Server 2000作為數據庫,所以如果想使用AUTO或是IDENTITY生成策略,則一定要對主鍵加上identity標識,如identity(1,1)。不過對于AUTO來說,是根據不同的數據庫選擇最合適的自增主鍵生成策略。如果使用MySQL,則主鍵要定義AUTO_INCREMENT,如果是Oracle,則要創建Sequence來實現自增。不管采用何種生成策略,增、刪、改這些方法中一定要加入事務,否則數據是不會添加到數據庫中滴~~~這是大象反復測試過的結果!
              5、創建數據庫及表
                 接下來,我們需要為本例創建一個數據庫及必要的表。數據庫名為ajax,表只有兩個EMPLOYEEGENERATOR_TABLE,下面是SQL腳本:
          CREATE TABLE EMPLOYEE(
              EMPLOYEE_ID 
          int not null,
              EMPLOYEE_NAME 
          varchar (20null,
              SEX 
          char (2null,
              BIRTHDAY 
          varchar(10null,
              ADDRESS 
          varchar(50null,
              
          CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPLOYEE_ID)


          CREATE TABLE GENERATOR_TABLE(
              ID 
          int not null,
              G_KEY 
          varchar(20null,
              G_VALUE 
          int null,
              
          CONSTRAINT PK_GENERATOR_TABLE PRIMARY KEY (ID) 
          )

          INSERT INTO GENERATOR_TABLE VALUES(1,EMPLOYEE_PK,1)
                 如果你覺得麻煩,不想建庫及表,可以將后面的數據庫下載下來,然后還原數據庫就可以了。
              6、修改hibernate.cfg.xml
                 本例中,采用的是JTDS連接驅動,我們要對配置文件作一些設置,另外還要加入POJO類。
              <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
              
          <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
              
          <property name="connection.url">jdbc:jtds:sqlserver://localhost:1433/ajax</property>
              
          <property name="connection.username">sa</property>
              
          <property name="connection.password">自己密碼(無密碼就空著)</property>
              
          <!-- 實體類 -->
              
          <mapping class="com.ajax.employee.model.Employee"/>
                 以前沒有使用JPA注解的時候,我們這里加入的都是hbm.xml文件,現在我們則加入的是類。
              7、創建EmployeeManager
                 在com.ajax.employee.service下新建EmployeeManager類,這里面就是寫業務方法,另外在這個類中添加一個main方法用于測試,將log4j的日志級別調整為DEBUG,這樣我們就可以看到很詳細的程序運行信息,源碼中的注釋很詳細,這里就不貼出來了。
              本例沒有提供MySQLOracle數據庫的腳本,不過這些應該很簡單,按照最基本的方式建一個數據庫和兩張表就行了,這里附上兩種數據庫的hibernate配置。
              MySQL:
              <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
              
          <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
              
          <property name="connection.url">jdbc:mysql://localhost:3306/ajax</property>
              
          <property name="connection.username">root</property>
              
          <property name="connection.password">自己的密碼(無密碼就空著)</property>
              Oracle:
              <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
              
          <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
              
          <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:自己的SID</property>
              
          <property name="connection.username">system</property>
              <property name="connection.password">自己的密碼(無密碼就空著)</property>
              本文主要是從實用的角度來說明如何在Hibernate中使用JPA注釋來簡化開發從這里可以看出,我們不需要再編寫繁瑣的hbm.xml文件。另外,JPA的功能很強大,這里只展示了其中的冰山一角,如果想深入學習JPA的話,請單獨查找資料或購買相關書籍。
              下面是本例中必須的JAR包
              點擊下載:antlr-2.7.6  asm-1.5.3  cglib-2.1.3  commons-collections-2.1.1  commons-lang-2.1
                       commons-logging-1.0.4  log4j-1.2.14  ehcache-1.2.3  ejb3-persistence-3.0 
                       hibernate3-3.2.5  hibernate-annotations-3.3.0  hibernate-commons-annotations-3.0.0  
                       mysql-connector.jar  jtds.jar  classes12.jar
              點擊下載:ajax_project  db_ajax
              本文為菠蘿大象原創,如要轉載請注明出處。
          posted on 2008-09-19 00:33 菠蘿大象 閱讀(30338) 評論(3)  編輯  收藏 所屬分類: Hibernate

          評論:
          # re: 學習JPA——Hibernate Annotation使用實例 2008-09-20 17:03 | huangzhiwei
          不錯
          學習了
          謝謝  回復  更多評論
            
          # re: 學習JPA——Hibernate Annotation使用實例 2010-07-07 11:30 | RoyPayne
          e...
          頭像還是原來的可愛。
          哇哈哈~~  回復  更多評論
            
          # re: 學習JPA——Hibernate Annotation使用實例 2010-07-07 11:37 | 菠蘿大象
          @RoyPayne
          咳咳。。。這個是大象本人,我怕用那個喬巴頭像,少年周刊和尾田榮一郎找我索賠。  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          隨筆分類(67)

          隨筆檔案(67)

          搜索

          •  

          積分與排名

          • 積分 - 781932
          • 排名 - 55

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黑龙江省| 竹溪县| 双柏县| 南召县| 监利县| 大丰市| 大荔县| 昔阳县| 登封市| 兴宁市| 杂多县| 萝北县| 沭阳县| 沈丘县| 新野县| 荔浦县| 韩城市| 芒康县| 南充市| 凤山县| 登封市| 库伦旗| 银川市| 平乐县| 龙岩市| 印江| 治县。| 连城县| 高陵县| 井冈山市| 繁昌县| 耿马| 吴川市| 务川| 厦门市| 若尔盖县| 张北县| 曲阜市| 丹巴县| 峨山| 永宁县|