Hibernate筆記

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

//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-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、複寫equalshashCode方法

·equals:對象比較方法

·hashCode:取得Hash編碼

對於equalshashCode方法的複寫,可以使用第三方工具: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>

發佈了24 篇原創文章 · 獲贊 7 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章