【hibernate】<第二節>hibernate的一對多映射(基本類型)

  所需工具與前文一致!java

  第一部份內容:基本類型的一對多(one to many)mysql

  以部門表與員工表爲例:sql

  目錄結構:數據庫

    

  hibernate.cfg.xml內容session

    

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <session-factory>
 7     <!-- 基礎配置(必須的配置) -->
 8         <!-- 配置數據庫的驅動類 -->
 9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
10         <!-- 配置數據庫的別名 -->
11         <!-- 什麼是別名?你們都知道hibernate一個重要的優勢是能夠跨數據庫使用,實現這點的緣由就在這裏,hibernate爲每種常見的數據庫都
12         實現了特定的sql語句,好比就分頁來講,mysql就是limit語句,而oracle就是噁心的多個select嵌套在一塊兒,可是hibernate自己不
13         能識別數據庫的類型,在這裏咱們經過設置別名來告訴hibernate使用什麼數據庫的語句來實現
14         不一樣數據庫的別名分別是什麼?
15         hibernate的包裏有一個是經常使用配置文件,從這裏能夠查到
16         Hiberante開發包__hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
17          -->
18         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
19         <!-- 配置數據庫的url地址 -->
20         <property name="hibernate.connection.url">jdbc:mysql:///test</property>
21         <!-- 配置數據庫的用戶名 -->
22         <property name="hibernate.connection.username">root</property>
23         <!-- 配置數據庫的密碼 -->
24         <property name="hibernate.connection.password">root</property>
25         
26     <!-- 非必須配置 -->
27         <!-- 是否在控制檯打印sql語句,建議開發時打開,發佈後關閉 -->
28         <property name="show_sql">true</property>
29         <!-- 格式化控制檯打印的sql語句 -->
30         <!--<property name="format_sql">true</property>  -->
31         <!-- hibernate有兩種開發流程,一個是先在數據庫裏建好庫,建好表,再寫對應的實體類,與對應關係。另外一種是按需求直接寫實體類與對應關係,再經過hibernate自動
32         生成對應的數據庫裏的表。若是想自動生成表就要配置這個hbm2ddl.auto這個屬性了,這個屬性有好幾個值,通常用update,其他的查文檔吧
33          -->
34         <property name="hbm2ddl.auto">update</property>
35         
36     <!-- 添加映射文件 -->
37         <!-- <mapping resource="cn/kiwifly/entity/User.hbm.xml"/> -->
38     </session-factory>
39 </hibernate-configuration>

    兩個實體類:oracle

      Department.java app

package cn.kiwifly.entity;

import java.util.HashSet;
import java.util.Set;

public class Department {

    private Integer id;
    private String name;
    private Set<Employee> employees = new HashSet<>();

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Set<Employee> employees) {
        this.employees = employees;
    }

    public String toString() {
        return "Department [id=" + id + ", name=" + name + ", employees="
                + employees + "]";
    }

}

    Employee.javaeclipse

package cn.kiwifly.entity;

public class Employee {

    private Integer id;
    private String name;
    private Integer age;
    private Department department;

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", age=" + age
                + ", department=" + department.getName() + "]";
    }

}

    兩個實體類的配置文件:工具

      department.hbm.xmlthis

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.kiwifly.entity">
    <class name="Department" table="t_department">
        <id name="id" column="id" type="integer">
            <generator class="native" />
        </id>
        <property name="name" column="name" type="string"/>
        <set name="employees" table="t_employee" inverse="true">
            <key column="department_id" />
            <one-to-many class="Employee" />
        </set>
    </class>
</hibernate-mapping>

           employee.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">
<hibernate-mapping package="cn.kiwifly.entity">
    <class name="Employee" table="t_employee">
        <id name="id" column="id" type="integer">
            <generator class="native" />
        </id>
        <property name="name" column="name" type="string" />
        <property name="age" column="age" type="integer" />
        <many-to-one name="department" column="department_id" class="Department" />
    </class>
</hibernate-mapping>

               hibernate 一對多映射格式

類型

特色

    映射格式

Set

無序,不重複

<set name=」主表中一對多的屬性「 table=」集合表」>

   <key column=」集合表外鍵」 />

   <element type=」字段類型」 column=」字段名」>

</set>

List

有序,可重複

<list name=」主表中一對多的屬性「 table=」集合表」>

   <key column=」集合表外鍵」 />

   <list-index column=」排序序列」/>

   <element type=」字段類型」 column=」字段名」>

</list>

Array

有序,可重複(同List)

(因不能動態增加,因此不經常使用)

<array name=」主表中一對多的屬性「 table=」集合表」>

   <key column=」集合表外鍵」 />

   <list-index column=」排序序列」/>

   <element type=」字段類型」 column=」字段名」>

</array>    (與List基本同樣)

Bag

有序,可重複

(hibernate特有對象)

<bag name=」主表中一對多的屬性「 table=」集合表」>

   <key column=」集合表外鍵」 />

   <element type=」字段類型」 column=」字段名」>

</bag>      (與Set基本同樣)

Map

鍵值對,無序,Key不可重複

<map name=」主表中一對多的屬性「 table=」集合表」>

   <key column=」集合表外鍵」 />

   <map-key  type=」類型」 column=」鍵字段」></map-key>

   <element type=」字段類型」 column=」字段名」>

</map>     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一些細節問題:

    一、寫類的toStirng()方法的時候要注意,若是隻是有eclipse的快捷鍵複寫,可能會出現棧溢出的異常,由於eclipse的複寫只是寫了類名,由於這裏的相互引用會出現死循環

    二、以上重點在set的映射,其他的都是在其基礎上映射的

    三、List與Array與Set相比多了一個list-index屬性,就是這個屬性來讓list變的有序,這麼就引出一個問題;數據庫如何保證數據的有序性哪? 

      hibernate的做法:設置一個索引字段;用以保存順序;

    四、set有兩個重要的屬性inverse與cascade這裏沒說,但很重要,有不少博客說的很詳細,能夠看看

相關文章
相關標籤/搜索