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

Hibernate 3 Annotations 進階

2013-11-23 20:22:08  來源: Java開源技術 

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

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

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

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

  現在讓我們一步步了解Hibernate Annotations
安裝 Hibernate Annotations

    為了使用Hibernate Annotations你需要最新的Hibernate 當然還有Java 你可以在Hibernate web site 這個網站下載Hibernate 和Hibernate Annotations庫除了標准的Hibernate 庫文件和必須的依賴庫之外還需要下載 Hibernate Annotations庫和Java 持久化API ejbpersstencejar文件如果你正在使用Maven僅僅添加相應的依賴到你的DOM文件裡如下所示:

  
    <dependency>
      <groupId>orghibernate</groupId>
      <artifactId>hibernate</artifactId>
      <version>ga</version>
    </dependency>
    <dependency>
      <groupId>orghibernate</groupId>
      <artifactId>hibernateannotations</artifactId>
      <version>ga</version>
    </dependency>
    <dependency>
      <groupId>javaxpersistence</groupId>
      <artifactId>persistenceapi</artifactId>
      <version></version>
    </dependency>

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

  sessionFactory
=new AnnotationConfiguration()buildSessionFactory();

  一般的你需要通過<mapping>元素在Hibernate配置文件裡(hibernatecfgxml)聲明持久化類
  

  <hibernateconfiguration>
          <sessionfactory>
            <mapping class=comonjavamodelplanesdomainPlaneType/>
            <mapping class=comonjavamodelplanesdomainModelPlane/>
          </sessionfactory>
  </hibernateconfiguration>

  如今許多java 工程都使用輕量級的程序框架例如Spring如果你正在用Spring框架你可以容易地利用AnnotationSessionFactory類裝配一個基於Annotations 的Hibernate Session Factory如下:

  <! Hibernate session factory >
  <bean id=sessionFactory
class=orgspringframeworkormhibernateannotationAnnotationSessionFactoryBean>
   <property name=dataSource>
     <ref bean=dataSource/>
   </property>
   <property name=hibernateProperties>
     <props>
       <prop key=hibernatedialect>orghibernatedialectDerbyDialect</prop>
       <prop key=hibernatehbmddlauto>create</prop>
      
     </props>
   </property>
   <property name=annotatedClasses>
     <list>
       <value>comonjavamodelplanesdomainPlaneType</value>
       <value>comonjavamodelplanesdomainModelPlane</value>
      
     </list>
   </property>
</bean>



我們第一個持久化類

    現在我們知道如何獲得基於Annotation的Hibernate Session 讓我們看看這個注解的持久化類看起來像什麼樣子
    被注解的持久化類是一般的POJO類就像在其他Hibernate程序裡的一樣好的差不多了你需要依賴於Java 持久化API (javaxpersistence*)並且還需要導入注解包類(orghibernateannotations*)如果你使用了任何Hibernate擴展的話但是除此之外他們僅僅是擁有持久化相關注解的POJO這有個例子:

  @Entity
public class ModelPlane {

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

    public void setId(Long id) {
        thisid = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        thisname = name;
}
}

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

生成主鍵

    Hibernate一個擅長的功能是主鍵自動生成Hibernate/EJB 注解也為主鍵自動生成提供了豐富的支持允許諸多生成策略下面例子演示了最常見的用途這裡Hibernate 根據數據庫給出一個合適的主鍵生成策略

  @Id
    @GeneratedValue (strategy=GenerationTypeAUTO)
    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) {
        thisid = id;
    }

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

    public void setName(String name) {
        thisname = name;
}
}

  它將映射到下面的表

  CREATE TABLE T_MODEL_PLANE
(
    PLANE_ID long
PLANE_NAME varchar
)

  你可以利用Table和Column屬性自定義映射它可讓你指定諸如列長度notnull約束等等hibernate支持大量的屬性注解:

  
    @Column(name=PLANE_ID length= nullable=true)
    public String getName() {
        return name;
}



映射關系

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

  @ManyToOne( cascade = {CascadeTypePERSIST CascadeTypeMERGE} )
    public PlaneType getPlaneType() {
                    return planeType;
          }

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

  @OneToMany(mappedBy=planeType
                   cascade=CascadeTypeALL
                   fetch=FetchTypeEAGER)
    @OrderBy(name)
    public List<ModelPlane> getModelPlanes() {
        return modelPlanes;
}

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

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

  @NamedQueries(
{        
  @NamedQuery(
    name=planeTypefindById
    query=select p from PlaneType p left join fetch pmodelPlanes where id=:id
  )
  @NamedQuery(
    name=planeTypefindAll
    query=select p from PlaneType p
  )
  @NamedQuery(
          name=planeTypedelete
          query=delete from PlaneType where id=:id
        )  
}
)

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

總結

    Hibernate 注解提供了一個強大而優雅的API來簡化java數據庫持久化代碼在這裡我們僅僅涉及到表面的知識你選擇貼近標准並且利用java持久化API或者收益於Hibernate的規范擴展 在以失去某種輕便性為代價的基礎上它提供了更為強大靈活的功能不管怎麼樣通過避免了xml映射文件使用Hibernate注解可以簡化你的程序維護另外的好處是指給你一個走進EJB 大門的幽徑


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28382.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.