Hibernate笔记

来源:互联网 发布:美国非农数据是指 编辑:程序博客网 时间:2024/05/17 06:51

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类中与表中其他字段的映射

//namePerson类中的属性名称

//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-Mailmldnqa@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、复写equalshashCode方法

·equals:对象比较方法

·hashCode:取得Hash编码

对于equalshashCode方法的复写,可以使用第三方工具: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>