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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    Hibernate 3 Annotations 進階

    kjj 發表于 2007-04-09 07:39:25
    作者:kjj     來源:Onjava;Matrix
    評論數:5 點擊數:1,888     投票總得分:0 投票總人次:0
    關鍵字:Hibernate Annotations
     

    摘要:

    這些年來,Hibernate幾乎已經成為java世界中數據庫持久化方面事實上的標準,它強大靈活并且性能優秀.在這篇文章中,我們來看一下Java 5的注解功能怎么簡單地用在你的hibernate代碼中讓你的持久化層變得更容易.
    這些年來,Hibernate幾乎已經成為java世界中數據庫持久化方面事實上的標準,它強大靈活并且性能優秀.在這篇文章中,我們來看一下Java 5的注解功能怎么簡單地用在你的hibernate代碼中讓你的持久化層變得更容易.

    在過去,Hibernate 依靠外部的XML文件來配置持久化對象,數據庫映射文件定義在一組XML映射文件里并且在程序開始的時候被裝載.有很多辦法來創建這些映射文件,或者自動從一個已存在的數據庫模式里創建,或者手動從java類對象中創建.不管那種情況,你都得產生一大堆Hibernate 映射文件而結束工作.,你也可以利用外部工具從javadoc-style 的注解中生成映射文件,但這給你的開發流程增加了額外的負擔.

    在最近的Hibernate版本里,一個新的建立在Java 5 注解之上更為優雅的方法出現了.利用新的Hibernate Annonations 庫,你可以發布一次如你以前的映射文件所定義的信息,你猜到了-注解直接嵌入你的Java類文件里.注解帶來了一種強大靈活地聲明持久化映射的辦法.在最新版的幾個Java集成開發環境里都很好的支持,并帶有代碼自動完成和語法高亮功能.

    Hibernate annotations 也支持最新的EJB 3持久化規范,這些規范目的是提供一個標準的Java持久化機制.當然Hibernate 3也提供了更多的解決方案,你能非常容易的靠近保準并且利用EJB 3編程模型編寫你的Hibernate持久化層.

    現在讓我們一步步了解Hibernate Annotations.


    版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接
    作者:kjj
    原文:http://www.matrix.org.cn/resource/article/2007-04-09/Hibernate+Annotations_62c034f4-e62a-11db-b1bd-fb5572962927.html
    關鍵字:Hibernate Annotations

    安裝 Hibernate Annotations

    為了使用Hibernate Annotations,你需要最新的Hibernate 3.2 ,當然還有Java 5 你可以在Hibernate web site 這個網站下載Hibernate 3.2和Hibernate Annotations庫.除了標準的Hibernate 庫文件和必須的依賴庫之外,還需要下載 Hibernate Annotations庫和Java 持久化API ---ejb3-persstence.jar文件.如果你正在使用Maven,僅僅添加相應的依賴到你的DOM文件里,如下所示:
     ...
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate</artifactId>
          <version>3.2.1.ga</version>
        </dependency>
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-annotations</artifactId>
          <version>3.2.0.ga</version>
        </dependency>
        <dependency>
          <groupId>javax.persistence</groupId>
          <artifactId>persistence-api</artifactId>
          <version>1.0</version>
        </dependency>
    ...


    下一步是獲得一個Hibernate Session 工廠.利用Hibernate Annotations與不使用它創建Hibernate session工廠有一點不同,雖然不需要大幅度修改.你只需須簡單地使用AnnotationConfiguration類安裝你的session工廠:
        
    sessionFactory
    =new AnnotationConfiguration().buildSessionFactory();


    一般的,你需要通過<mapping>元素在Hibernate配置文件里(hibernate.cfg.xml)聲明持久化類
      


            <hibernate-configuration>
              <session-factory>
                <mapping class="com.onjava.modelplanes.domain.PlaneType"/>
                <mapping class="com.onjava.modelplanes.domain.ModelPlane"/>
              </session-factory>
      </hibernate-configuration>


    如今許多java 工程都使用輕量級的程序框架例如Spring.如果你正在用Spring框架,你可以容易地利用AnnotationSessionFactory類裝配一個基于Annotations 的Hibernate Session Factory,如下:
    <!-- Hibernate session factory -->
      <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
       <property name="dataSource">
         <ref bean="dataSource"/>
       </property>
       <property name="hibernateProperties">
         <props>
           <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
           <prop key="hibernate.hbm2ddl.auto">create</prop>
           ...
         </props>
       </property>
       <property name="annotatedClasses">
         <list>
           <value>com.onjava.modelplanes.domain.PlaneType</value>
           <value>com.onjava.modelplanes.domain.ModelPlane</value>
           ...
         </list>
       </property>
    </bean>


    我們第一個持久化類

    現在我們知道如何獲得基于Annotation的Hibernate Session ,讓我們看看這個注解的持久化類看起來像什么樣子.
    被注解的持久化類是一般的POJO類,就像在其他Hibernate程序里的一樣.好的,差不多了.你需要依賴于Java 持久化API (javax.persistence.*),并且還需要導入注解包類(org.hibernate.annotations.*)如果你使用了任何Hibernate擴展的話.但是除此之外,他們僅僅是擁有持久化相關注解的POJO.這有個例子:
    @Entity
    public class ModelPlane {

        private Long id;
        private String name;
        
        @Id
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
    }
    }


    如我們所言,非常簡單.@Entity注解聲明類將被持久化.@Id注解讓你指示持久化類的唯一性標識屬性.實際上,你可以持久化字段(注解成員變量)或者持久化屬性(通過注釋getter方法.在這篇文章的剩余部分,我們將用基于屬性的注解.關于基于注解的持久化一個好處是他的缺省行為.例如.你不需要聲明每一個屬性是否要被持久化-任何屬性都假定將被持久化除非用@Transient注解了他. 對代碼來說這是簡單的,并且相對于舊的XML配置文件來說,也節省了很多打字量.

    生成主鍵

    Hibernate一個擅長的功能是主鍵自動生成,Hibernate/EJB 3注解也為主鍵自動生成提供了豐富的支持,允許諸多生成策略.下面例子演示了最常見的用途,這里Hibernate 根據數據庫給出一個合適的主鍵生成策略.
        @Id
        @GeneratedValue (strategy=GenerationType.AUTO)
        public Long getId() {
            return id;
    }


    自定義表和字段映射
    默認情況下,Hibernate將映射持久化類到表,用匹配的字段名映射.例如,上面的類將經由下列SQL語句映射到表:
    CREATE TABLE MODELPLANE 
    (
        ID long,
    NAME varchar
    )


    如果你自己生成和維護數據庫的話非常好,并且使你的代碼易于維護.然而,他不適合所有需求.有些程序需要訪問外部數據庫,并且可能需要公司數據庫命名轉換.如果需要的話,你可以使用@Table和@Column注解進行你的持久化映射:
    @Entity
    @Table(name="T_MODEL_PLANE")
    public class ModelPlane {

        private Long id;
        private String name;
        
        @Id
        @Column(name="PLANE_ID")
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        @Column(name="PLANE_NAME")
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
    }
    }


    它將映射到下面的表
    CREATE TABLE T_MODEL_PLANE 
    (
        PLANE_ID long,
    PLANE_NAME varchar
    )


    你可以利用Table和Column屬性自定義映射.它可讓你指定諸如列長度,not-null約束等等,hibernate支持大量的屬性注解:
    ...
        @Column(name="PLANE_ID", length=80, nullable=true)
        public String getName() {
            return name;
    }


    映射關系

    Java持久化映射中一個最重要,最復雜的部分是確定怎么映射表間的關系.如其他的特性一樣,Hibernate在這方面也提供了大量的靈活性,但是以增加了某種復雜度為代價的.我們將瀏覽一系列共同的用例以對如何使用注解有個大體認識.
    最常用的一個關系是many-to-one關系.假定在上面的例子中,每個ModelPlane經由many-to-one關系被關聯到一個PlaneType (換句話說每個Model plane 被確切的關聯到一個 plane type,通過給定一個plane type可以被關聯到多個 model plane ),你可以映射如下:
       @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
        public PlaneType getPlaneType() {
                        return planeType;
              }


    這個CascadeType值表示Hibernate將怎么進行級聯操作
    另外一個常用的關系是與上面相對的:one-to-many關系,也以集合而聞名,集合將映射變得有些復雜,在舊的和新的注解中,并且我們將撇開表面細節直接給你完成的例子以給你一個大概,例如在上面例子中,每一個PlaneType對象可能包含一個ModelPlane的集合,可以映射如下:

        @OneToMany(mappedBy="planeType",
                       cascade=CascadeType.ALL,
                       fetch=FetchType.EAGER)
        @OrderBy("name")
        public List<ModelPlane> getModelPlanes() {
            return modelPlanes;
    }


    命名查詢
    Hibernate一個優秀的特征是可以在映射文件申明命名查詢的能力.這些查詢可以通過名字在代碼里調用,這可以讓你集中查詢且避免有sql或者Hql代碼分散在程序里.

    你也可以通過注解,利用@NameQueries和@NameQuery注解,如下:

    @NamedQueries(
    {        
      @NamedQuery(
        name="planeType.findById",
        query="select p from PlaneType p left join fetch p.modelPlanes where id=:id"
      ),
      @NamedQuery(
        name="planeType.findAll",
        query="select p from PlaneType p"
      ),
      @NamedQuery(
              name="planeType.delete",
              query="delete from PlaneType where id=:id"
            )  
    }
    )


    一旦定義,可以可以調用正如其他命名查詢.

    總結

    Hibernate 3注解提供了一個強大而優雅的API來簡化java數據庫持久化代碼,在這里我們僅僅涉及到表面的知識,你選擇貼近標準,并且利用java持久化API或者收益于Hibernate的規范擴展, 在以失去某種輕便性為代價的基礎上,它提供了更為強大靈活的功能.不管怎么樣,通過避免了xml映射文件.使用Hibernate注解可以簡化你的程序維護,另外的好處是指給你一個走進EJB 3大門的幽徑.
     
    另附:
      1 xml version="1.0" encoding="UTF-8"?>   
      2 <beans xmlns="http://www.springframework.org/schema/beans"   
      3   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
      4   xmlns:aop="http://www.springframework.org/schema/aop"   
      5   xmlns:tx="http://www.springframework.org/schema/tx"   
      6   xsi:schemaLocation="http://www.springframework.org/schema/beans   
      7         http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
      8            http://www.springframework.org/schema/aop   
      9            http://www.springframework.org/schema/aop/spring-aop-2.0.xsd   
     10                       http://www.springframework.org/schema/tx   
     11                       http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">   
     12   <!-- 定義數據庫連接的信息,如driverClass,jdbcUrl,user,password等 -->   
     13   <bean id="propertyConfigurer"   
     14         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   
     15     <property name="location" value="/WEB-INF/config/jdbc.properties"/>   
     16   <!--</span-->bean>   
     17   <!-- 定義數據源,該bean的ID為dataSource -->   
     18   <bean id="dataSource"   
     19         class="com.mysql.jdbc.Driver"   
     20         destroy-method="close">   
     21     <!-- 指定數據庫驅動 -->   
     22     <property name="driverClass"><value>${driverClass}<!--</span-->value><!--</span-->property>   
     23     <!-- 指定數據庫連接的URL -->   
     24     <property name="jdbcUrl"><value>${jdbcUrl}<!--</span-->value><!--</span-->property>   
     25     <!-- 指定數據庫用戶名 -->   
     26     <property name="user"><value>${user}<!--</span-->value><!--</span-->property>   
     27     <!-- 指定數據庫用戶密碼 -->   
     28     <property name="password"><value>${password}<!--</span-->value><!--</span-->property>   
     29     <property name="minPoolSize"><value>1<!--</span-->value><!--</span-->property>   
     30     <property name="maxPoolSize"><value>20<!--</span-->value><!--</span-->property>   
     31     <property name="maxIdleTime"><value>1800<!--</span-->value><!--</span-->property>   
     32     <property name="acquireIncrement"><value>2<!--</span-->value><!--</span-->property>   
     33     <property name="maxStatements"><value>0<!--</span-->value><!--</span-->property>   
     34     <property name="initialPoolSize"><value>2<!--</span-->value><!--</span-->property>   
     35     <property name="idleConnectionTestPeriod"><value>1800<!--</span-->value><!--</span-->property>   
     36     <property name="acquireRetryAttempts"><value>30<!--</span-->value><!--</span-->property>   
     37     <property name="breakAfterAcquireFailure"><value>true<!--</span-->value><!--</span-->property>   
     38     <property name="testConnectionOnCheckout"><value>false<!--</span-->value><!--</span-->property>   
     39   <!--</span-->bean>   
     40   <!-- 定義Hibernate的SessionFactory加載.hbm.xml文件時用這種配置-->   
     41   <!--<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">-->   
     42   <!-- 定義AnnotationHibernate的SessionFactory -->   
     43   <bean id="sessionFactory"   
     44         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">   
     45     <!-- 依賴注入數據源,注入dataSource -->   
     46     <property name="dataSource" ref="dataSource" />   
     47     <!-- mappingResources屬性用來列出全部映射文件 -->   
     48     <property name="annotatedClasses">   
     49       <list>   
     50       <!-- 列出所有PO實體文件 -->   
     51         <value>com.daniel.lr.crbt.share.db.User<!--</span-->value>   
     52       <!--</span-->list>   
     53     <!--</span-->property>   
     54     <!-- 定義Hibernate的SessionFactory的屬性 -->   
     55     <property name="hibernateProperties">   
     56       <props>   
     57         <!-- 指定Hibernate的連接方言 -->   
     58         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect<!--</span-->prop>   
     59         <!-- 不同數據庫連接,啟動時選擇create,update,create-drop -->   
     60         <prop key="hibernate.hbm2ddl.auto">update<!--</span-->prop>   
     61         <prop key="hibernate.show_sql">true<!--</span-->prop>   
     62         <prop key="hibernate.generate_statistics">true<!--</span-->prop>   
     63         <prop key="hibernate.connection.release_mode">auto<!--</span-->prop>                        
     64         <prop key="hibernate.autoReconnect">true<!--</span-->prop>   
     65         <prop key="hibernate.bytecode.use_reflection_optimizer">true<!--</span-->prop>   
     66       <!--</span-->props>   
     67     <!--</span-->property>   
     68     <property name="eventListeners">   
     69       <map>   
     70         <entry key="merge">   
     71           <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>   
     72         <!--</span-->entry>   
     73       <!--</span-->map>   
     74     <!--</span-->property>   
     75   <!--</span-->bean>   
     76   <aop:config proxy-target-class="true">   
     77     <aop:advisor pointcut="execution(* *..Hibernate.*(..))" advice-ref="txAdvice"/>   
     78   <!--</span-->aop:config>   
     79   <tx:advice id="txAdvice">   
     80     <tx:attributes>   
     81       <tx:method name="*" read-only="false"/>   
     82     <!--</span-->tx:attributes>   
     83   <!--</span-->tx:advice>   
     84   <!-- 配置Hibernate的事務管理 -->   
     85   <bean id="transactionManager"   
     86         class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
     87     <property name="sessionFactory" ref="sessionFactory"/>   
     88   <!--</span-->bean>   
     89   <!-- 配置DaoBean -->   
     90   <bean id="userDao" class="com.daniel.lr.crbt.share.dao.UserDao">   
     91     <!-- 為DAO注入所需的DataSource實例 -->   
     92     <property name="sessionFactory" ref="sessionFactory"/>   
     93   <!--</span-->bean>   
     94   <!-- 配置userDao bean的事務代理 -->   
     95   <bean id="userDaoProxy"   
     96         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
     97     <property name="transactionManager" ref="transactionManager" />   
     98     <property name="target" ref="userDao"/>   
     99     <property name="transactionAttributeSource">   
    100       <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>   
    101     <!--</span-->property>   
    102   <!--</span-->bean>   
    103   <!-- Spring代理Struts的Action Action不使用Singleton-->   
    104   <bean name="/login"   
    105         class="com.daniel.lr.crbt.service.web.action.LoginAction"   
    106         scope="prototype">   
    107     <property name="userDao" ref="userDao"/>   
    108   <!--</span-->bean>   
    109 <!--</span-->beans>   
    110 
    posted on 2007-10-08 13:21 蘆葦 閱讀(1247) 評論(2)  編輯  收藏 所屬分類: Hibernate

    Feedback

    # re: Hibernate 3 Annotations 進階 2007-10-08 13:53 蘆葦
    在hibernate3中可以自動建數據庫及自動導入數據.在hibernate.properties文件里加入:
    hibernate.hbm2ddl.auto=create
    就可以自動建表結構
    設hibernate.hbm2ddl.auto為update/create-drop/create其中一種都會改變表結構,如果同時在classpath中寫一個/import.sql文件,里包含了數據內容的insert等,那么hibernate3在啟動時就會執行import.sql的內容。  回復  更多評論
      

    # re: Hibernate 3 Annotations 進階 2007-10-08 13:53 蘆葦
    WEB-INF/classes/hibernate.properties
    hibernate.hbm2ddl.auto=create
    hibernate.hbm2ddl.auto=create
    WEB-INF/classes/import.sql
    源碼復制打印
    INSERT INTO mytable(id,name) values(1,'name1');
    INSERT INTO mytable(id,name) values(2,'name2');
    INSERT INTO mytable(id,name) values(3,'name3');
    INSERT INTO mytable(id,name) values(1,'name1');
    <br/> INSERT INTO mytable(id,name) values(2,'name2');
    <br/> INSERT INTO mytable(id,name) values(3,'name3');
    當WEB運行時,hibernate會自動重新生成表結構并插入import.sql里的那三條記錄.   回復  更多評論
      

    主站蜘蛛池模板: 成人A片产无码免费视频在线观看| 在免费jizzjizz在线播| 光棍天堂免费手机观看在线观看| 亚洲国产精品无码中文字| 日韩免费无码一区二区三区 | 亚洲精品久久无码| 成人午夜亚洲精品无码网站| 久久午夜伦鲁片免费无码| 337P日本欧洲亚洲大胆精品| 最近中文字幕无免费视频| 亚洲人成7777| 国产精品免费观看久久| 一个人看的免费观看日本视频www| 亚洲无码精品浪潮| 一级毛片a免费播放王色| 亚洲色偷偷偷网站色偷一区| 午夜性色一区二区三区免费不卡视频 | WWW国产亚洲精品久久麻豆| 亚洲国产精品热久久| 又黄又爽的视频免费看| 亚洲成人在线免费观看| 亚美影视免费在线观看 | 99久久久国产精品免费蜜臀| 国产精品亚洲小说专区| 亚洲国产亚洲片在线观看播放| 亚洲天堂中文字幕在线| 午夜视频免费成人| 91av免费观看| 十八禁在线观看视频播放免费| 噜噜综合亚洲AV中文无码| 亚洲人成电影在线观看青青| 国产亚洲综合成人91精品 | 亚洲成a人片7777| 亚洲国产第一站精品蜜芽| 亚洲高清偷拍一区二区三区| 成人免费乱码大片A毛片| 亚洲天天在线日亚洲洲精| 久久亚洲精品无码播放| 免费国产综合视频在线看 | 中文字幕日韩亚洲| 四虎影视永久免费观看地址 |