Hibernate 3 Annotations 進階

來源:互聯網
上載者:User
摘要:

這些年來,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大門的幽徑. 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.