熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

學習JPA——Hibernate Annotation使用實例

2013-11-23 20:39:08  來源: Java開源技術 
    目前JPA(Java Persistence API)的使用范圍越來越廣作為Java EE 平台標准的ORM規范得到了諸如HibernateTopLinkOpenJpa等ORM框架的支持同時還是EJB 的重要組成部分JPA的宗旨是為POJO提供持久化標准規范它能夠脫離容器獨立運行方便開發和測試本文將通過一個小實例來說明如何在Hibernate中使用JPA來達到簡化編程的目的
    開發環境  Eclipse   MyEclipse GA  Tomcat   SQL Server  
            hibernateGA  hibernateannotationsGA
            ejbpersistence  hibernatecommonsannotationsGA
    本文是為後續的多種Ajax技術框架應用系列作一個前期准備讓大家先了解一下相比與以前的Hibernate ORM映射的不同之處以及采用JPA所帶來的好處
    為了保證程序能順序運行避免不同的Eclipse版本之間產生錯誤大象強烈建議下載源碼後按源碼中的工程名自己單獨新建同一個工程再將src和WEBINF/lib目錄下的所有文件COPY至對應的目錄下
    創建Web Project
       點擊File>New選擇Web ProjectProject Name中輸入ajax點擊Finish下載本文後面需要用到的JAR包加入到WEBINF/lib目錄下在ajax工程中文本采用的是UTF編碼
    創建HibernateSessionFactory
       傳統的方法就是在工程名上點右鍵選擇MyEclipse>Add Hibernate Capabilities然後就是按照提示一步一步做不過在MyEclipse 中添加Hibernate還是只能支持除非你選擇 Add Spring Capabilities裡面才有Hibernate 的類庫要想完全兼容JPA必須采用以上版本

       這裡大家直接使用源碼中的HibernateSessionFactory注意請先建包reHibernateSessionFactory中有一個地方需要改動原來的寫法是

    private static Configuration configuration = new Configuration();       修改後為

    private static AnnotationConfiguration configuration = new AnnotationConfiguration();       因為我們采用的是JPA注釋方式來映射實體另外AnnotationConfiguration這個類在hibernateannotationsjar這個包中
    創建BaseDao
       在re包下面新建BaseDao抽象類裡面定義的是持久化操作方法有一點特別要注意一定要在增加刪除修改這幾個方法中加入事務控制不管是在BaseDao基類方法中加還是在業務方法中加一定要加事務控制大象覺得在基類中加會比較好一點這樣做代碼顯得更少更簡潔如果不加事務控制那麼增改這些操作都不會產生效果因為默認情況下它不會進行自動提交在做這個例子的時候這個問題曾經困擾了我好長時間因此請大家記住不要再犯和大象一樣的錯誤!貼出部分代碼詳情請看源碼裡面有很全面的注釋

/**
 * 抽象Dao類用於持久化操作
 * @author 菠蘿大象
 * @version 
 */
public abstract class BaseDao<T> {

    private static Log log = LogFactorygetLog(BaseDaoclass);
    
    /**
     * 獲取Hibernate的Session對象
     */
    public Session getSession(){
        return HibernateSessionFactorygetSession();
    }
    
    /**
     * 根據主鍵得到對象
     */
    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{
            sessionsaveOrUpdate(t);
            mit();
        }catch(Exception e){
            txrollback();
            logerror(保存對象失敗);
        }
    }
    
    /**
     * 創建事務
     */
    private Transaction beginTransaction(Session session){
        return sessionbeginTransaction();
    }
}    創建Employee
       在comajaxemployeemode包下新建Employee類這個就是POJO類下面來詳細說明裡面的含義

@Entity
@Table(name = EMPLOYEE)
public class Employee implements javaioSerializable{
    
    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=tabstore
         table=GENERATOR_TABLE
         pkColumnName = G_KEY
         pkColumnValue=EMPLOYEE_PK
         valueColumnName = G_VALUE
         allocationSize=
    )
    @GeneratedValue(strategy = GenerationTypeTABLEgenerator=tabstore)
    public Integer getEmployee_id() {
        return employee_id;
    }
    public void setEmployee_id(Integer employee_id) {
        thisemployee_id = employee_id;
    }
}       其它幾個屬性的getter和setter省略這裡我們要用到ejbpersistencejarJPA的注解類就在這個包中下面詳細說明上面使用到的注解
      @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最大為那麼此時生成器表中與實體表主鍵對應的鍵名值則為
        allocationSize表示每次主鍵值增加的大小例如設置成則表示每次創建新記錄後自動加默認為

      @GeneratedValue定義主鍵生成策略這裡因為使用的是TableGenerator所以主鍵的生成策略為GenerationTypeTABLE生成主鍵策略的名稱則為前面定義的tabstore
       這裡大象想說下網上有很多文章寫的是strategy = GenerationTypeAUTO或是strategy = GenerationTypeSEQUENCE采用SEQUENCE序列是因為Oracle數據中不支持identity自動增長要想使用它還得在數據庫中創建一個序列如果要更換數據庫那將是一個非常麻煩的事情SEQUENCE生成方式我們暫且不談這裡說下采用AUTO和IDENTITY的生成方式本例采用的是SQL Server 作為數據庫所以如果想使用AUTO或是IDENTITY生成策略則一定要對主鍵加上identity標識如identity()不過對於AUTO來說是根據不同的數據庫選擇最合適的自增主鍵生成策略如果使用MySQL則主鍵要定義AUTO_INCREMENT如果是Oracle則要創建Sequence來實現自增不管采用何種生成策略改這些方法中一定要加入事務否則數據是不會添加到數據庫中滴~~~這是大象反復測試過的結果!
    創建數據庫及表
       接下來我們需要為本例創建一個數據庫及必要的表數據庫名為ajax表只有兩個EMPLOYEE和GENERATOR_TABLE下面是SQL腳本

CREATE TABLE EMPLOYEE(
    EMPLOYEE_ID int not null
    EMPLOYEE_NAME varchar () null
    SEX char () null
    BIRTHDAY varchar() null
    ADDRESS varchar() null
    CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPLOYEE_ID)


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

INSERT INTO GENERATOR_TABLE VALUES(EMPLOYEE_PK)       如果你覺得麻煩不想建庫及表可以將後面的數據庫下載下來然後還原數據庫就可以了
    修改hibernatecfgxml
       本例中采用的是JTDS連接驅動我們要對配置文件作一些設置另外還要加入POJO類

    <property name=dialect>orghibernatedialectSQLServerDialect</property>
    <property name=connectiondriver_class>netsourceforgejtdsjdbcDriver</property>
    <property name=connectionurl>jdbc:jtds:sqlserver://localhost:/ajax</property>
    <property name=connectionusername>sa</property>
    <property name=connectionpassword>自己密碼(無密碼就空著)</property>
    <! 實體類 >
    <mapping class=comajaxemployeemodelEmployee/>       以前沒有使用JPA注解的時候我們這裡加入的都是hbmxml文件現在我們則加入的是類
    創建EmployeeManager
       在comajaxemployeeservice下新建EmployeeManager類這裡面就是寫業務方法另外在這個類中添加一個main方法用於測試將logj的日志級別調整為DEBUG這樣我們就可以看到很詳細的程序運行信息源碼中的注釋很詳細這裡就不貼出來了
    本例沒有提供MySQL和Oracle數據庫的腳本不過這些應該很簡單按照最基本的方式建一個數據庫和兩張表就行了這裡附上兩種數據庫的hibernate配置
    MySQL

    <property name=hibernatedialect>orghibernatedialectMySQLInnoDBDialect</property>
    <property name=connectiondriver_class>commysqljdbcDriver</property>
    <property name=connectionurl>jdbc:mysql://localhost:/ajax</property>
    <property name=connectionusername>root</property>
    <property name=connectionpassword>自己的密碼(無密碼就空著)</property>    Oracle

    <property name=hibernatedialect>orghibernatedialectOracleDialect</property>
    <property name=connectiondriver_class>oraclejdbcdriverOracleDriver</property>
    <property name=connectionurl>jdbc:oracle:thin:@::自己的SID</property>
    <property name=connectionusername>system</property>
    <property name=connectionpassword>自己的密碼(無密碼就空著)</property>    本文主要是從實用的角度來說明如何在Hibernate中使用JPA注釋來簡化開發以及為後面的多種Ajax技術框架應用系列作一個前期准備從這裡可以看出我們不需要再編寫繁瑣的hbmxml文件另外JPA的功能很強大這裡只展示了其中的冰山一角如果想深入學習JPA的話請單獨查找資料或購買相關書籍
    下面是本例中必須的JAR包
    點擊下載antlr  asm  cglib  commonscollections  commonslang
             commonslogging  logj  ehcache  ejbpersistence 
             hibernate  hibernateannotations  hibernatecommonsannotations  
             mysqlconnectorjar  jtdsjar  classesjar
    點擊下載ajax_project  db_ajax
    本文為菠蘿大象原創如要轉載請注明出處
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28835.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.