本人覺得開始學(xué)Hibernate,它的映射關(guān)系很是麻煩,寫映射文件極為容易出錯。所以就把映射表各元素詳細(xì)解釋。以記之。

這個示例是一個很簡單的數(shù)據(jù)表結(jié)構(gòu),一共有五張表
Student(學(xué)生表)
Address(地址表)
Classes(班級表)
Course(課程表)
Student_Course(學(xué)生-課程關(guān)聯(lián)表)

關(guān)系結(jié)構(gòu):
Student與Address為一對一關(guān)系
Student與Classes為一對多關(guān)系
Student與Course為多對多關(guān)系


Address.hbm.xml文件如下:
 1<?xml version="1.0"?>
 2<!DOCTYPE hibernate-mapping PUBLIC
 3    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
 4    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
 5<hibernate-mapping>
 6
 7<!-- class 標(biāo)簽里寫明Class文件的地址與相對應(yīng)的表名 -->
 8<class 
 9    name="student.hibernate.Address" 
10    table="Address"
11>
12<!-- id 為主鍵
13        name 為Class(JavaBean) 中的一個屬性
14        type 為Java類型
15        column 標(biāo)識Class文件對應(yīng)的數(shù)據(jù)表的主鍵 -->
16    <id
17        name="id"
18        type="java.lang.String"
19        column="id"
20    >
21    <!-- 以下是生成主鍵的方式
22    class="foreign" 表示為以外鍵方式生成(foregin為系統(tǒng)自帶的主鍵生成器),需要與one-to-one聯(lián)合起來使用
23    如果這個生成器實例需要某些配置值或者初始化參數(shù),用<param>元素來傳遞。
24    這里的屬性 property 為外鍵生成所必須的參數(shù)?為one-one結(jié)構(gòu)的第二個one的 name?  -->
25        <generator class="foreign" >
26            <param name="property">student</param>
27        </generator>
28    </id>
29<!-- property 定義 Class(JavaBean)的屬性,name為屬性名,column為對應(yīng)的表的字段 -->
30    <property
31        name="city"
32        type="java.lang.String"
33        column="city"
34        not-null="true"
35        length="20"
36    />
37    <property
38        name="street"
39        type="java.lang.String"
40        column="street"
41        length="20"
42    />
43    <property
44        name="doorplate"
45        type="java.lang.Integer"
46        column="doorplate"
47        length="10"
48    />
49  
50    <!-- bi-directional one-to-one association to Student -->
51    <!-- 以下是與Student對象一對一關(guān)系的定義
52    name="student"為JavaBean中定義的Student類的屬性 -->
53    <one-to-one
54        name="student"
55        class="student.hibernate.Student"
56        outer-join="auto"
57        constrained="false"
58    />
59</class>
60</hibernate-mapping>
61

Student.hbm.xml的代碼:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" 
>
    
<hibernate-mapping>
<class 
    
name="student.hibernate.Student" 
    table
="Student"
>
    
<id
        
name="id"
        type
="java.lang.String"
        column
="id"
    
>
        
<generator class="uuid.hex" ></generator>
    
</id>
    
<property
        
name="name"
        type
="java.lang.String"
        column
="name"
        not-null
="true"
        length
="20"
    
/>
    
<property
        
name="sex"
        type
="java.lang.String"
        column
="sex"
        length
="10"
    
/>
    
<!-- bi-directional one-to-many association to StudentCourse -->
    
<!-- key is foregin key of table,use the first "many"'s primary key-->
    
<set name="courses" lazy="true" inverse="true" cascade="none"
        table
="student_course">
        
<key>
            
<column name="studentId" />
        
</key>
        
<many-to-many class="student.hibernate.Course"
                column
="courseId">
        
</many-to-many>
    
</set>
    
<!--many to one: column是以Classes表的主鍵作為此表的外鍵-->
    
<many-to-one name="classes" column="classesId" />
    
    
<!-- bi-directional one-to-one association to Address -->
    
<one-to-one name="address" class="student.hibernate.Address"
        outer-join
="auto" cascade="all" />
</class>
</hibernate-mapping>


Classes.hbm.xml文件代碼

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" 
>
<hibernate-mapping>

<class 
    
name="student.hibernate.Classes" 
    table
="Classes"
>

    
<id
        
name="id"
        type
="java.lang.Integer"
        column
="id"
    
>
    
<!-- 主鍵生成方式“increment”表示自動增加,用于 int ,long,short 類型-->
        
<generator class="increment" />
    
</id>

    
<property
        
name="name"
        type
="java.lang.String"
        column
="name"
        length
="20"
    
/>

    
<!-- Associations -->
    
<!-- bi-directional one-to-many association to Student 
    一對多的關(guān)系--用set(JavaBean中定義的集合類型)標(biāo)簽
    name 為類屬性
    lazy 為延遲裝載
    inverse (可選——默認(rèn)為false) 標(biāo)記這個集合作為雙向關(guān)聯(lián)關(guān)系中的方向一端。
    cascade 表示級聯(lián)更新
-->
    
<set
        
name="students"
        lazy
="true"
        inverse
="true"
        cascade
="none"
    
>
    
<!-- key 表示用本xml文件定義的表的主鍵作為 many(Student)端對應(yīng)表的外鍵 -->
        
<key>
            
<column name="classesId" ></column>
        
</key>
        
<one-to-many 
            
class="student.hibernate.Student"
        
></one-to-many>
    
</set>
</class>
</hibernate-mapping>

Course.hbm.xml文件
 1<?xml version="1.0"?>
 2<!DOCTYPE hibernate-mapping PUBLIC
 3    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
 4    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
 5<hibernate-mapping>
 6
 7    <class name="student.hibernate.Course" table="Course">
 8        <id name="id" type="java.lang.Integer" column="id">
 9            <generator class="increment" ></generator>
10        </id>
11
12        <property name="name" type="java.lang.String" column="name"
13            not-null="true" length="20" />
14
15        <!-- bi-directional one-to-many association to StudentCourse -->
16        <!-- 多對多關(guān)系,這里用 set 標(biāo)簽
17        table 為多對多關(guān)系中的中間表
18        key 定義本xml文件定義的表的主鍵作為中間表的外鍵 -->
19        <set name="students" lazy="true" inverse="true"
20            cascade="none" table="student_course">
21            <key>
22                <column name="courseId" ></column>
23            </key>
24            <!-- 定義多對多關(guān)系中后一個 many 對應(yīng)的Class
25            column 為以后一個many(Student)對應(yīng)表的主鍵作為中間表的外鍵 -->
26            <many-to-many class="student.hibernate.Student"
27                column="studentId">
28            </many-to-many>
29        </set>
30    </class>
31</hibernate-mapping>
32