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