hibernate的兩種映射

Hibernate裏的字段映射有2種方式,一是直接在Java文件裏註解,我叫做註解定義;一是利用hbm.xml文件+普通的Bean文件映射,我叫做mapping定義。但是不管怎樣,這2種方式不能一起使用,混合使用也不行!要麼就用第1種方式,要麼用第2種方式。當然,如果一個項目中有2個或多個需要映射,我們把其中的User表用直接在Java文件中映射,而另外的Product表用hbm.xml映射,這是可以的。

1.自增型主鍵:
     1.1 oracle9/10:Oracle9/10並沒有自增長字段,所以定義和別的不太一樣
         1.1.1註解定義:
@Entity
@Table(name = "USERS")
@javax.persistence.SequenceGenerator(name="SEQ_USER", sequenceName="SEQ_USERS")
public class UserByZhuJie {
     private Integer id;

     @Id
     @Column(updatable=false, insertable=false)
     //@GeneratedValue(strategy = GenerationType.AUTO)     //自增長ID
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_USER")
     public Integer getId() {
         return id;
     }
                
         1.1.2mapping定義:
         <id name="id" column="ID" type="integer">
             <generator class="sequence">
                 <param name="sequence">SEQ_USERS</param>
             </generator>
          </id>
     1.2 MySQL、MS SQLSERVER爲代表的,有自增長字段
         1.2.1註解定義:
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public Integer getId() {
         return id;
     }
         1.2.2mapping定義:
         <id name="id" column="ID" type="integer">
             <generator class="native"/>
          </id>
2.一般的字段類型(string,date,integer等等)
     2.1註解定義:
         不用註解;
     2.2mapping定義:
         <property name="name" column="NAME" type="string" not-null="true"/>
3.Clob字段類型:關於Clob字段類型,網上有很多種說法,我現在給出其中一種,是測試通過的,我往數據庫裏寫入一個31K左右的數據成功執行。
     3.0在Java的Bean文件裏,把Clob字段定義成String型的:
...
public class User {
...
     private String descn;
...
     public String getDescn() {
         return descn;
     }

     public void setDescn(String descn) {
         this.descn = descn;
     }
}
     3.1註解定義:
         不用註解;

     3.2mapping定義:
         <property name="descn" column="DESCN" type="text"/>
4.Date字段類型。
     4.0在Java的Bean文件裏,把Date字段定義成Date型的:
...
import java.util.Date;

...
     private Date publishDate;
...
     public Date getPublishDate() {
         return publishDate;
     }

     public void setPublishDate(Date publishDate) {
         this.publishDate = publishDate;
     }
}

     4.1註解定義:
         不用註解;
     4.2mapping定義:
         <property name="publishDate" column="ATTR4" type="date"/>     //這裏我們是把publichDate屬性映射到表的ATTR4這個字段上了

 

5.繼承關係映射,以bookstore例中的Book-Product爲例,Book實例從Product繼承而來,但是2者共用1張數據表(product表):
     5.1註解定義:
         5.1.1Product.java源文件,這個源文件可以在bookstore例子中找到:
package org.springside.bookstoredemo.model;

import javax.persistence.*;

import org.apache.commons.lang.StringUtils;
import org.compass.annotations.SearchableComponent;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.springside.core.dao.extend.UndeleteableEntityOperation;

/**
* 產品.帶jpa與hibernate擴展的annotation 及compass annotation.
*
* @author cac
* @author schweigen
*/

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("product")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Product {
     private static final int SHORT_DESCN_LENGTH = 200;

     @SearchableId
     private Integer id;

     @SearchableComponent
     private Category category;

     private Integer inventory;

     @SearchableProperty
     private String name;

     private String descn;

     private Double unitprice=0.0;

     private String status = UndeleteableEntityOperation.NORMAL_VALUE;

     private String shortDescn = null;

      @ManyToOne
     @JoinColumn(name = "CATEGORY_ID")
     public Category getCategory() {
         return this.category;
     }
     public String getDescn() {
         return this.descn;
     }

     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public Integer getId() {
         return id;
     }

     public Integer getInventory() {
         return this.inventory;
     }

     public String getName() {
         return this.name;
     }

     @Transient
     public String getShortDescn() {
         if (shortDescn == null) {
             shortDescn = StringUtils.substring(descn, 0, SHORT_DESCN_LENGTH) + "...";
         }
         return shortDescn;
     }

     public String getStatus() {
         return this.status;
     }

     public Double getUnitprice() {
         return this.unitprice;
     }

      public void setCategory(Category category) {
         this.category = category;
     }
    
   
     public void setDescn(String descn) {
         this.descn = descn;
     }

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

     public void setInventory(Integer inventory) {
         this.inventory = inventory;
     }

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

     public void setShortDescn(String shortDescn) {
         this.shortDescn = shortDescn;
     }

     public void setStatus(String status) {
         this.status = status;
     }

     public void setUnitprice(Double unitprice) {
         this.unitprice = unitprice;
     }
}
     5.1.2Book.java源文件,這個源文件在bookstore例中找到:
package org.springside.bookstoredemo.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableProperty;
import org.springside.core.dao.extend.Undeletable;

/**
* 圖書.帶jpa 與 compass的 annotation配置.
*
* @author cac
* @author schweigen
* @see Product
*/
@Entity
@DiscriminatorValue("book")
@Searchable(alias = "book")
@Undeletable
public class Book extends Product {

     @SearchableProperty
     private String author;

     private String image;

     @SearchableProperty
     private String publisher;

     private Date publishDate;

     @Column(name = "ATTR1")
     public String getAuthor() {
         return author;
     }

     public void setAuthor(String author) {
         this.author = author;
     }

     @Column(name = "ATTR2")
     public String getImage() {
         return image;
     }

     public void setImage(String image) {
         this.image = image;
     }

     @Column(name = "ATTR3")
     public String getPublisher() {
         return publisher;
     }

     public void setPublisher(String publisher) {
         this.publisher = publisher;
     }

     @Column(name = "ATTR4")
     public Date getPublishDate() {
         return publishDate;
     }

     public void setPublishDate(Date publishDate) {
         this.publishDate = publishDate;
     }
}
以上2個文件列出了Book是如何從Product繼承過來的,主要分析class的定義部分,以及2個實例對屬性定義有什麼不同。

     5.2mapping定義:特別要說明的是,因爲Book和Product的繼承關係,我們在定義映射的時候要捆綁定義,也就是說要麼2者都採用註解定義,要麼2者都採用mapping方式定義
         5.2.1Product.java源文件:
package org.springside.bookstoredemo.model;


import org.apache.commons.lang.StringUtils;

public class Product {
     private static final int SHORT_DESCN_LENGTH = 200;

     private Integer id;

     private Category category;

     private Integer inventory;

     private String name;

     private String descn;
   
     private String type;

     private Double unitprice=0.0;

     private String status = "1";

     private String shortDescn = null;

     public Category getCategory() {
         return this.category;
     }
     public String getDescn() {
         return this.descn;
     }

     public Integer getId() {
         return id;
     }

     public Integer getInventory() {
         return this.inventory;
     }

     public String getName() {
         return this.name;
     }
     public String getShortDescn() {
         if (shortDescn == null) {
             shortDescn = StringUtils.substring(descn, 0, SHORT_DESCN_LENGTH) + "...";
         }
         return shortDescn;
     }

     public String getStatus() {
         return this.status;
     }

     public Double getUnitprice() {
         return this.unitprice;
     }

      public void setCategory(Category category) {
         this.category = category;
     }
    
      public void setDescn(String descn) {
         this.descn = descn;
     }

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

     public void setInventory(Integer inventory) {
         this.inventory = inventory;
     }

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

     public void setShortDescn(String shortDescn) {
         this.shortDescn = shortDescn;
     }

     public void setStatus(String status) {
         this.status = status;
     }

     public void setUnitprice(Double unitprice) {
         this.unitprice = unitprice;
     }
}
從Product.java源文件可以看出,在用hbm.xml和java文件一起定義映射的時候,java文件實際上是1個普通的Javabean,是沒有任何註解的,所有的映射都是在Product.hbm.xml中完成。
         5.2.2Book.java源文件:
package org.springside.bookstoredemo.model;

import java.util.Date;


public class Book extends Product {

     private String author;

     private String image;

     private String publisher;

     private Date publishDate;

     public String getAuthor() {
         return author;
     }

     public void setAuthor(String author) {
         this.author = author;
     }

     public String getImage() {
         return image;
     }

     public void setImage(String image) {
         this.image = image;
     }

     public String getPublisher() {
         return publisher;
     }

     public void setPublisher(String publisher) {
         this.publisher = publisher;
     }

     public Date getPublishDate() {
         return publishDate;
     }

     public void setPublishDate(Date publishDate) {
         this.publishDate = publishDate;
     }
}
         5.2.3Product.hbm.xml源文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2007-6-22 15:06:10 by Hibernate Tools 3.2.0.b9 -->
<hibernate-mapping package="org.springside.bookstoredemo.model">
     <class name="Product" table="product" catalog="bookstore" discriminator-value="product">
         <id name="id" type="int">
             <column name="ID" />
             <generator class="native" />
         </id>

     <discriminator column="TYPE" type="string"/>
       
         <property name="name" type="string">
             <column name="NAME" length="80" not-null="true">
             </column>
         </property>
         <property name="descn" type="string">
             <column name="DESCN">
             </column>
         </property>
         <property name="unitprice" type="double">
             <column name="UNITPRICE" precision="10">
             </column>
         </property>
         <property name="inventory" type="java.lang.Integer">
             <column name="INVENTORY">
             </column>
         </property>
         <property name="status" type="string">
             <column name="STATUS">
             </column>
         </property>
         <many-to-one name="category" column="category_id" update="false"/>
     </class>
</hibernate-mapping>
其中<discriminator column="TYPE" type="string"/>這行語句定義了繼承規則是列TYPE的值,如果是book,那麼就是實體Book的一“行”,下面的 Book.hbm.xml通過<subclass name="Book" extends="Product" discriminator-value="book">表示的意義就是Book從Product繼承過來,而且繼承的數據是TYPE列的值爲 'book'

         5.2.4Book.hbm.xml源文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2007-6-22 15:06:10 by Hibernate Tools 3.2.0.b9 -->
<hibernate-mapping package="org.springside.bookstoredemo.model">
     <subclass name="Book" extends="Product" discriminator-value="book">
         <property name="author" type="string">
             <column name="ATTR1">
                 <comment></comment>
             </column>
         </property>
         <property name="image" type="string">
             <column name="ATTR2">
                 <comment></comment>
             </column>
         </property>
         <property name="publisher" type="string">
             <column name="ATTR3">
                 <comment></comment>
             </column>
         </property>
         <property name="publishDate" type="date">
             <column name="ATTR4">
                 <comment></comment>
             </column>
         </property>
     </subclass>
</hibernate-mapping>
     5.3幾條簡單的Hibernate後臺語句:
      [java] Hibernate: select count(*) as col_0_0_ from bookstore.product book0_
where book0_.type='book' and book0_.STATUS<>'-1'
      [java] Hibernate: select book0_.ID as ID0_, book0_.NAME as NAME0_, book0_.D
ESCN as DESCN0_, book0_.UNITPRICE as UNITPRICE0_, book0_.INVENTORY as INVENTORY0
_, book0_.STATUS as STATUS0_, book0_.category_id as category8_0_, book0_.ATTR1 a
s ATTR9_0_, book0_.ATTR2 as ATTR10_0_, book0_.ATTR3 as ATTR11_0_, book0_.ATTR4 a
s ATTR12_0_, from bookstore.product book0_
where book0_.type='book' and book0_.STATUS<>'-1' order by book0_.ID desc limit

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/evanerv0079/archive/2008/06/03/2509128.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章