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

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