1) 主鍵生成方式<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
assigned:指派,即由用戶自行管理
//HBM根元素 指定POJO類所在的包<hibernate-mapping package=" POJO類所在的包路徑">
//指定Person類與PERSON表的映射 <class name="Person"table="PERSON">
//name表示Person類中的屬性名字 //column:表示表中的字段名字 //type:類型
<id name="id"column="ID"type="string">
//主鍵的生成方式:assigned:表示由用戶自行管理 <generator class="assigned"/>
</id>
//表示Person類中與表中其他字段的映射
//name:Person類中的屬性名稱
//column:表中的字段名稱
//type:類型
//not-null:不允許爲空
<property name="name"column="NAME"type="string"not-null="true"/>
<property name="password"column="PASSWORD"type="string"not-null="true"/>
<property name="sex"column="SEX"type="string"/>
<property name="email"column="EMAIL"type="string"/>
</class>
</hibernate-mapping>
此文件完成Person類到PERSON表的關係
取得操作數據庫的Session:
Session是一個接口,必須通過其他類實例化,格式是固定的
//找到Hibernate配置
Configuration config=new Configuration().configure();
//從配置中取出SessionFactory
SessionFactory factory=config.buildSessionFactory();
//從SessionFactory中取出一個Session
this.session=factory.openSession();
通過正常配置之後,發現數據無法存入
事務處理,在插入完成之後,必須將事務提交:Transaction
使用Hibernate操作數據庫,代碼量很少,由Hibernate完成
用戶就感覺像使用對象一樣去使用數據庫
所有的操作過程都是通過POJO類完成
主鍵生成方式:assigned:指派
·Sequence:自動增長的數據段
·uuid.hex:生成一個32位,不會重複的主鍵
2) 實體映射-粒度設計
☆ 所謂的細粒度劃分,是指在POJO類上的面向對象的劃分,而不在於表的劃分上.
例如: 配置文件:
<?xml version="1.0"encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--DO NOT EDIT:This is a generated file that is synchronized-->
<!--by MyEclipse Hibernate tool integration.-->
<!--Created Sat Nov 11 20:51:28 CST 2006-->
<hibernate-mapping package=" POJO類所在的包路徑">
<class name="Person"table="PERSON">
<id name="id"column="ID"type="long">
<generator class="assigned"/>
</id>
<component name="name"class="org.lxh.hibernate.Name">
<property name="firstname"column="FIRSTNAME"type="string"not-null="true"/>
<property name="lastname"column="LASTNAME"type="string"not-null="true"/>
</component>
E-Mail:[email protected]<component name="contact"class="org.lxh.hibernate.Contact">
<property name="address"column="ADDRESS"type="string"not-null="true"/>
<property name="zipcode"column="ZIPCODE"type="string"not-null="true"/>
<property name="tel"column="TEL"type="string"/>
</component>
</class>
</hibernate-mapping>
3) 複合主鍵
如果要實現複合主鍵,首先類應該先滿足以下要求:
1、本類必須實現Serializable接口
2、複寫equals和hashCode方法
·equals:對象比較方法
·hashCode:取得Hash編碼
對於equals和hashCode方法的複寫,可以使用第三方工具:commons-lang-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1.0.1.jar
方法一:Persion.java
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
public class Person implements Serializable {
private String name;
private String phone;
private int age;
public boolean equals(Object obj) {
// TODO 自動生成方法存根
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
return new EqualsBuilder().append(this.name, p.name).append(this.phone,
p.phone).append(this.age, p.age).isEquals();
}
public int hashCode() {
// TODO 自動生成方法存根
return new HashCodeBuilder().append(this.name).append(this.age).append(
this.phone).toHashCode();
}
Setter/getter….
}
Person.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!-- Created Sat Nov 11 21:30:08 CST 2006 -->
<hibernate-mapping package=" POJO類所在的包路徑">
<class name="Person" table="PERSON">
<composite-id>
<key-property name="name" column="NAME" type="string"/>
<key-property name="phone" column="PHONE" type="string"/>
</composite-id>
<property name="age" column="AGE" type="int" />
</class>
</hibernate-mapping>
方法二:使用主鍵類
PersonKey.java
/*
* WARNING: DO NOT EDIT THIS FILE. This is a generated file that is synchronized
* by MyEclipse Hibernate tool integration.
*
* Created Sat Nov 11 21:36:22 CST 2006 by MyEclipse Hibernate Tool.
*/
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
/**
* A class representing a composite primary key id for the PERSON
* table. This object should only be instantiated for use with instances
* of the Person class.
* WARNING: DO NOT EDIT THIS FILE. This is a generated file that is synchronized
* by MyEclipse Hibernate tool integration.
*/
public class PersonKey
implements Serializable
{
/** The cached hash code value for this instance. Settting to 0 triggers re-calculation. */
private volatile int hashValue = 0;
/** The value of the NAME component of this composite id. */
private java.lang.String name;
/** The value of the PHONE component of this composite id. */
private java.lang.String phone;
/**
* Simple constructor of PersonKey instances.
*/
public PersonKey()
{
}
/**
* Returns the value of the name property.
* @return java.lang.String
*/
public java.lang.String getName()
{
return name;
}
/**
* Sets the value of the name property.
* @param name
*/
public void setName(java.lang.String name)
{
hashValue = 0;
this.name = name;
}
/**
* Returns the value of the phone property.
* @return java.lang.String
*/
public java.lang.String getPhone()
{
return phone;
}
/**
* Sets the value of the phone property.
* @param phone
*/
public void setPhone(java.lang.String phone)
{
hashValue = 0;
this.phone = phone;
}
/**
* Implementation of the equals comparison on the basis of equality of the id components.
* @param rhs
* @return boolean
*/
public boolean equals(Object obj)
{
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
PersonKey p = (PersonKey) obj;
return new EqualsBuilder().append(this.name, p.getName()).append(this.phone,
p.getPhone()).isEquals();
}
/**
* Implementation of the hashCode method conforming to the Bloch pattern with
* the exception of array properties (these are very unlikely primary key types).
* @return int
*/
public int hashCode()
{
return new HashCodeBuilder().append(this.name).append(
this.phone).toHashCode();
}
}
Person.java
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
public class Person implements Serializable {
private PersonKey id ;
private int age;
setter/getter…
}
Person.hbm.mxl
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!-- Created Sat Nov 11 21:36:21 CST 2006 -->
<hibernate-mapping package=" POJO類所在的包路徑">
<class name="Person" table="PERSON">
<composite-id name="id" class="PersonKey">
<key-property name="name" column="NAME" type="string"/>
<key-property name="phone" column="PHONE" type="string"/>
</composite-id>
<property name="age" column="AGE" type="int" />
</class>
</hibernate-mapping>
4) 實體層設計
方法一: 數據庫結構CREATE TABLE TItem
(
id varchar(32) not null primary key ,
name varchar(20) not null ,
manufacturer varchar(20)
) ;
CREATE TABLE TBook
(
id varchar(32) not null primary key ,
pagecount int
) ;
CREATE TABLE TDvd
(
id varchar(32) not null primary key ,
regioncode varchar(2)
) ;
TItem.java
public class TItem {
private String id ;
private String name ;
private String manufacturer ;
setter/getter…
}
TDVD.java
public class TDVD extends TItem {
private String regionCode ;
setter/getter…
}
TBook.java
public class TBook extends TItem {
private int pageCount ;
setter/getter…
}
Titem.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!-- Created Mon Dec 18 19:38:27 CST 2006 -->
<hibernate-mapping package="POJO類所在的包路徑">
<class name="TItem" table="TITEM">
<id name="id" column="ID" type="string">
<generator class="assigned" />
</id>
<property name="name" column="NAME" type="string" not-null="true" />
<property name="manufacturer" column="MANUFACTURER" type="string" />
<joined-subclass name="org.lxh.hibernate04.TBook" table="TBook">
<key column="ID"></key>
<property name="pageCount" type="java.lang.Integer" column="pagecount"></property>
</joined-subclass>
<joined-subclass name="org.lxh.hibernate04.TDVD" table="TDvd">
<key column="ID"></key>
<property name="regionCode" type="java.lang.String" column="regioncode"></property>
</joined-subclass>
</class>
</hibernate-mapping>
方法一: 數據庫結構
CREATE TABLE TItem
(
id varchar(32) not null primary key ,
-- 通過此字段用於區分保存的是 Book還是 DVD
category varchar(2) not null ,
name varchar(20) not null ,
manufacturer varchar(20) not null ,
regionCode varchar(2) ,
pageCount int
)
TItem.java
public class TItem {
private String id ;
private String name ;
private String manufacturer ;
setter/getter…
}
TDVD.java
public class TDVD extends TItem {
private String regionCode ;
setter/getter…
}
TBook.java
public class TBook extends TItem {
private int pageCount ;
setter/getter…
}
Titem.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!-- Created Mon Dec 18 20:01:47 CST 2006 -->
<hibernate-mapping package="org.lxh.hibernate05">
<class name="TItem" table="TITEM">
<id name="id" column="ID" type="string">
<generator class="assigned" />
</id>
<discriminator column="category" type="java.lang.String"></discriminator>
<property name="name" column="NAME" type="string" not-null="true" />
<property name="manufacturer" column="MANUFACTURER" type="string" not-null="true" />
<subclass name="org.lxh.hibernate05.TBook" discriminator-value="1">
<property name="pageCount" column="PAGECOUNT" type="int" />
</subclass>
<subclass name="org.lxh.hibernate05.TDVD" discriminator-value="2">
<property name="regionCode" column="REGIONCODE" type="string" />
</subclass>
</class>
</hibernate-mapping>