<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-67  評(píng)論-522  文章-0  trackbacks-0
        目前,JPAJava Persistence API)的使用范圍越來(lái)越廣,作為Java EE 5.0平臺(tái)標(biāo)準(zhǔn)的ORM規(guī)范,得到了諸如:HibernateTopLinkOpenJpaORM框架的支持,同時(shí)還是EJB 3.0的重要組成部分。JPA的宗旨是為POJO提供持久化標(biāo)準(zhǔn)規(guī)范。它能夠脫離容器獨(dú)立運(yùn)行,方便開(kāi)發(fā)和測(cè)試。本文將通過(guò)一個(gè)小實(shí)例來(lái)說(shuō)明如何在Hibernate中使用JPA,來(lái)達(dá)到簡(jiǎn)化編程的目的。
        開(kāi)發(fā)環(huán)境  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所帶來(lái)的好處。
        為了保證程序能順序運(yùn)行,避免不同的Eclipse版本之間產(chǎn)生錯(cuò)誤,大象強(qiáng)烈建議,下載源碼后,按源碼中的工程名,自己?jiǎn)为?dú)新建同一個(gè)工程,再將srcWEB-INF/lib目錄下的所有文件COPY至對(duì)應(yīng)的目錄下。
        1、創(chuàng)建Web Project
           點(diǎn)擊"File"->"New",選擇"Web Project",在"Project Name"中輸入ajax,點(diǎn)擊"Finish"。下載本文后面需要用到的JAR包,加入到WEB-INF/lib目錄下,在ajax工程中,文本采用的是UTF-8編碼。
        2、創(chuàng)建HibernateSessionFactory
           傳統(tǒng)的方法就是在工程名上點(diǎn)右鍵,選擇”MyEclipse”->”Add Hibernate Capabilities”,然后就是按照提示一步一步做,不過(guò)在MyEclipse 6.0.1中添加Hibernate還是只能支持3.1,除非你選擇” Add Spring Capabilities”,里面才有Hibernate 3.2的類(lèi)庫(kù),要想完全兼容JPA,必須采用3.2以上版本。
        
           這里大家直接使用源碼中的HibernateSessionFactory,注意請(qǐng)先建包:com.ajax.core,HibernateSessionFactory中有一個(gè)地方需要改動(dòng),原來(lái)的寫(xiě)法是:
        private static Configuration configuration = new Configuration();
           修改后為:
        private static AnnotationConfiguration configuration = new AnnotationConfiguration();
           因?yàn)槲覀儾捎玫氖?/span>JPA注釋方式來(lái)映射實(shí)體,另外AnnotationConfiguration這個(gè)類(lèi)在hibernate-annotations.jar這個(gè)包中。
        3、創(chuàng)建BaseDao
           在com.ajax.core包下面新建BaseDao抽象類(lèi),里面定義的是持久化操作方法,有一點(diǎn)特別要注意,一定要在增加、刪除、修改這幾個(gè)方法中加入事務(wù)控制,不管是在BaseDao基類(lèi)方法中加,還是在業(yè)務(wù)方法中加,一定要加事務(wù)控制,大象覺(jué)得在基類(lèi)中加會(huì)比較好一點(diǎn),這樣做代碼顯得更少更簡(jiǎn)潔。如果不加事務(wù)控制,那么增、刪、改這些操作都不會(huì)產(chǎn)生效果,因?yàn)槟J(rèn)情況下,它不會(huì)進(jìn)行自動(dòng)提交。在做這個(gè)例子的時(shí)候,這個(gè)問(wèn)題曾經(jīng)困擾了我好長(zhǎng)時(shí)間。因此,請(qǐng)大家記住不要再犯和大象一樣的錯(cuò)誤!貼出部分代碼,詳情請(qǐng)看源碼,里面有很全面的注釋。
    /**
     * 抽象Dao類(lèi),用于持久化操作
     * @author 菠蘿大象
     * @version 1.0
     */
    public abstract class BaseDao<T> {

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

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

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

        
    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(
    "保存對(duì)象失敗");
            }
        }
        
        
    /**
         * 創(chuàng)建事務(wù)
         */

        
    private Transaction beginTransaction(Session session){
            
    return session.beginTransaction();
        }
    }
        4、創(chuàng)建Employee
           在com.ajax.employee.mode包下新建Employee類(lèi),這個(gè)就是POJO類(lèi),下面來(lái)詳細(xì)說(shuō)明里面的含義。
    @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;
        }

    }
           其它幾個(gè)屬性的gettersetter省略,這里我們要用到ejb3-persistence.jar,JPA的注解類(lèi)就在這個(gè)包中,下面詳細(xì)說(shuō)明上面使用到的注解。
          @Entity通過(guò)@Entity注解將一個(gè)類(lèi)聲明為一個(gè)實(shí)體bean
          @Table通過(guò) @Table注解可以為實(shí)體bean映射指定表,name屬性表示實(shí)體所對(duì)應(yīng)表的名稱(chēng),如果沒(méi)有定義 @Table,那么系統(tǒng)自動(dòng)使用默認(rèn)值:實(shí)體的類(lèi)名(不帶包名)
          @Id用于標(biāo)記屬性的主鍵
          @Column表示持久化屬性所映射表中的字段,如果屬性名與表中的字段名相同,則可以省略@Column注解,另外有兩種方式標(biāo)記,一是放在屬性前,另一種是放在getter方法前,例如:
        @Column(name = "EMPLOYEE_NAME")
        
    private String employee_name;
           或者
        @Column(name = "EMPLOYEE_NAME")
        
    public String getEmployee_name() {
            
    return employee_name;
        }
           這兩種方式都是正解的,根據(jù)個(gè)人喜好來(lái)選擇。大象偏向于第二種,并且喜歡將屬性名與字段名設(shè)成一樣的,這樣可以省掉@Column注解,使代碼更簡(jiǎn)潔。
          @TableGenerator表生成器,將當(dāng)前主鍵的值單獨(dú)保存到一個(gè)數(shù)據(jù)庫(kù)表中,主鍵的值每次都是從指定的表中查詢來(lái)獲得,這種生成主鍵的方式是很常用的。這種方法生成主鍵的策略可以適用于任何數(shù)據(jù)庫(kù),不必?fù)?dān)心不同數(shù)據(jù)庫(kù)不兼容造成的問(wèn)題。大象推薦這種方式管理主鍵,很方便,集中式管理表的主鍵,而且更換數(shù)據(jù)庫(kù)不會(huì)造成很大的問(wèn)題。各屬性含義如下:
            name表示該表主鍵生成策略的名稱(chēng),這個(gè)名字可以自定義,它被引用在@GeneratedValue中設(shè)置的"generator"值中
            table表示表生成策略所持久化的表名,說(shuō)簡(jiǎn)單點(diǎn)就是一個(gè)管理其它表主鍵的表,本例中,這個(gè)表名為GENERATOR_TABLE
            pkColumnName表生成器中的列名,用來(lái)存放其它表的主鍵鍵名,這個(gè)列名是與表中的字段對(duì)應(yīng)的
            pkColumnValue實(shí)體表所對(duì)應(yīng)到生成器表中的主鍵名,這個(gè)鍵名是可以自定義滴
            valueColumnName表生成器中的列名,實(shí)體表主鍵的下一個(gè)值,假設(shè)EMPLOYEE表中的EMPLOYEE_ID最大為2,那么此時(shí),生成器表中與實(shí)體表主鍵對(duì)應(yīng)的鍵名值則為3
            allocationSize表示每次主鍵值增加的大小,例如設(shè)置成1,則表示每次創(chuàng)建新記錄后自動(dòng)加1,默認(rèn)為50
        
          @GeneratedValue定義主鍵生成策略,這里因?yàn)槭褂玫氖?/span>TableGenerator,所以,主鍵的生成策略為GenerationType.TABLE生成主鍵策略的名稱(chēng)則為前面定義的tab-store
           這里大象想說(shuō)下,網(wǎng)上有很多文章寫(xiě)的是strategy = GenerationType.AUTO或是strategy = GenerationType.SEQUENCE,采用SEQUENCE序列是因?yàn)?/span>Oracle數(shù)據(jù)中不支持identity自動(dòng)增長(zhǎng),要想使用它,還得在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)序列,如果要更換數(shù)據(jù)庫(kù),那將是一個(gè)非常麻煩的事情。SEQUENCE生成方式我們暫且不談,這里說(shuō)下采用AUTOIDENTITY的生成方式,本例采用的是SQL Server 2000作為數(shù)據(jù)庫(kù),所以如果想使用AUTO或是IDENTITY生成策略,則一定要對(duì)主鍵加上identity標(biāo)識(shí),如identity(1,1)。不過(guò)對(duì)于AUTO來(lái)說(shuō),是根據(jù)不同的數(shù)據(jù)庫(kù)選擇最合適的自增主鍵生成策略。如果使用MySQL,則主鍵要定義AUTO_INCREMENT,如果是Oracle,則要創(chuàng)建Sequence來(lái)實(shí)現(xiàn)自增。不管采用何種生成策略,增、刪、改這些方法中一定要加入事務(wù),否則數(shù)據(jù)是不會(huì)添加到數(shù)據(jù)庫(kù)中滴~~~這是大象反復(fù)測(cè)試過(guò)的結(jié)果!
        5、創(chuàng)建數(shù)據(jù)庫(kù)及表
           接下來(lái),我們需要為本例創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)及必要的表。數(shù)據(jù)庫(kù)名為ajax,表只有兩個(gè)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)
           如果你覺(jué)得麻煩,不想建庫(kù)及表,可以將后面的數(shù)據(jù)庫(kù)下載下來(lái),然后還原數(shù)據(jù)庫(kù)就可以了。
        6、修改hibernate.cfg.xml
           本例中,采用的是JTDS連接驅(qū)動(dòng),我們要對(duì)配置文件作一些設(shè)置,另外還要加入POJO類(lèi)。
        <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">自己密碼(無(wú)密碼就空著)</property>
        
    <!-- 實(shí)體類(lèi) -->
        
    <mapping class="com.ajax.employee.model.Employee"/>
           以前沒(méi)有使用JPA注解的時(shí)候,我們這里加入的都是hbm.xml文件,現(xiàn)在我們則加入的是類(lèi)。
        7、創(chuàng)建EmployeeManager
           在com.ajax.employee.service下新建EmployeeManager類(lèi),這里面就是寫(xiě)業(yè)務(wù)方法,另外在這個(gè)類(lèi)中添加一個(gè)main方法用于測(cè)試,將log4j的日志級(jí)別調(diào)整為DEBUG,這樣我們就可以看到很詳細(xì)的程序運(yùn)行信息,源碼中的注釋很詳細(xì),這里就不貼出來(lái)了。
        本例沒(méi)有提供MySQLOracle數(shù)據(jù)庫(kù)的腳本,不過(guò)這些應(yīng)該很簡(jiǎn)單,按照最基本的方式建一個(gè)數(shù)據(jù)庫(kù)和兩張表就行了,這里附上兩種數(shù)據(jù)庫(kù)的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">自己的密碼(無(wú)密碼就空著)</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">自己的密碼(無(wú)密碼就空著)</property>
        本文主要是從實(shí)用的角度來(lái)說(shuō)明如何在Hibernate中使用JPA注釋來(lái)簡(jiǎn)化開(kāi)發(fā)從這里可以看出,我們不需要再編寫(xiě)繁瑣的hbm.xml文件。另外,JPA的功能很強(qiáng)大,這里只展示了其中的冰山一角,如果想深入學(xué)習(xí)JPA的話,請(qǐng)單獨(dú)查找資料或購(gòu)買(mǎi)相關(guān)書(shū)籍。
        下面是本例中必須的JAR包
        點(diǎn)擊下載: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
        點(diǎn)擊下載:ajax_project  db_ajax
        本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。
    posted on 2008-09-19 00:33 菠蘿大象 閱讀(30310) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): Hibernate

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

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久www免费人成看片| 免费人成在线观看网站视频| 国产一级一片免费播放| 国产亚洲美女精品久久久| 亚洲视频在线观看免费视频| 美女18毛片免费视频| 在线观看免费中文视频| 国产一区二区三区免费视频| 亚洲好看的理论片电影| 国产亚洲精品第一综合| 免费无码成人AV在线播放不卡| 国产大片91精品免费观看男同| 亚洲视频在线播放| 黄页网站在线免费观看| 欧洲乱码伦视频免费| 中文亚洲AV片在线观看不卡| 亚洲Av高清一区二区三区| a级在线免费观看| 高清国语自产拍免费视频国产| 国产aⅴ无码专区亚洲av| 亚洲爆乳成av人在线视菜奈实| 免费一级不卡毛片| 日本中文一区二区三区亚洲| 亚洲国产品综合人成综合网站| 香蕉免费看一区二区三区| 免费无码又爽又刺激毛片| 亚洲成色999久久网站| 青青草国产免费国产是公开| 国产麻豆视频免费观看| 亚洲AV无码久久精品蜜桃| 美女免费视频一区二区| 成年人在线免费观看| 久久精品亚洲精品国产色婷| 乱人伦中文视频在线观看免费| 国产日本一线在线观看免费| 亚洲AV一宅男色影视| 一边摸一边爽一边叫床免费视频 | 美女内射毛片在线看免费人动物| 亚洲不卡无码av中文字幕| 亚洲人成网国产最新在线| 最近的中文字幕大全免费8|