1) 主键生成方式
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:mldnqa@163.com<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- 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>