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