关联

一、多对一进行关联(多个学生对应同一间宿舍)---学生是主体,宿舍是附体,关联关系在主体学生中设置,在学生类中设置宿舍类,由于宿舍类只有一个可以直接用类来设置,在映射学生类 (User)中包含宿舍这个类(Room),在映射配置文件(User.hbm.xml)中定义

<many-to-one name="room" column="room_id" cascade="save-update" class="com.wyq.hibernate2.Room"></many-to-one>

哪个是主体类就在哪个配置文件定义关联关系.

cascade属性:表示关联对象的持久化,该属性也要设置在主体中,作用就是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作.
cascade的值:all:表示所有情况下都进行级联操作.
                        none:所有情况下都不进行级联操作
                        save-update:在执行save-update时进行级联操作.
                        delete:在执行delete时进行级联操作.
注意:使用cascade自动持久化时,会先检查被关联物件的id属性,未被持久化的物件之id属性是由unsaved-value决定,预设是null,如果您使用long这样的原生型态(primitive type)时,则必须自行指定预设值.

例如:<id name="id" column="ROOM_ID" unsaved-value="0">
            <generator class="increment"/>
        </id>

如果您不想额外设定unsaved-value资讯,则可以将long改为Long,这可以符合预设的unsaved-value为null的设定 .

二、一对多进行关联(一间宿舍对应多个学生)---宿舍是主体,学生是附体,关联关系<one-to-many>在主体宿舍中设置,由于要在宿舍类中设置学生类,一个宿舍包含多个学生,所以在宿舍类中要用Set类来进行设置,用set类(private Set users = new HashSet();)来存储多个学生类,在映射宿舍类(Room)中要包含<set>这个节点,用来与user相关联

例如:<set name="users" table="USER">
            <key column="ROOM_ID"/>
            <one-to-many class="onlyfun.caterpillar.User"/>
        </set>

name:表示属性,table:表示关联的表名,key:表示通过什么字段进行关联,<one-to-many>:表示关联类。这里也可以使用cascade属性。

三、在表关联的设计中,不论是一对多还是多对一,都要将关联字段设置在多的那一方。
例如:user表格和room表格,要将关联字段room_id设置在user表格中。

四、一对一进行关联(一个人只有一个房间,一个房间也只有一个人)。
可以通过2中方式进行关联:

(1)、通过外键进行关联:在多对一的例子中就是通过外键进行关联的.
在user-room的设置中(user.hbm.xml):
<many-to-one name="room"
                     column="ROOM_ID"
                     class="onlyfun.caterpillar.Room"
                     cascade="all"
                     unique="true"/>
其中unique表示限制一个User有一独有的 Room,这只是单向的,说明一个user只有一个room.
在room-user的设置中(room.hbm.xml):
<one-to-one name="user"
                    class="onlyfun.caterpillar.User"
                    property-ref="room"/>
这样就完成了双向的一对一关联,property-ref告诉hibernate,查询出user并将其参考至room。
(2)、通过主键进行关联:限制两个资料表的主键使用相同的值,如此一个User与Room就是一对一关系
user.hbm.xml:
<one-to-one name="room"
                    class="onlyfun.caterpillar.Room"
                    cascade="all"/>
room.hbm.xml:
<one-to-one name="user"
                    class="onlyfun.caterpillar.User"
                    constrained="true"/>
使用constrained="true"告诉Hibernate参考至User的主键

五、双向关联,就是将一和二结合起来,如果将关联的维护交给User的话会比较容易,因为每个User都对应至一个Room,在储存时并用像Room一样必须对Set中的每个物件作检查,为了将关联的维护交给User,我们可以在Room.hbm.xml中的<set>修改,加上inverse="true",表示将关联的维护「反过来」交给User作

 例如:<set name="users" table="users" inverse="true" cascade="all">
              <key  column="room_id"/>
              <one-to-many class="onlyfun.caterpillar.User"/>

在设立双向关联时,关联由多对一中「多」的哪一方维护,会比由「一」的哪一方维护来的方便,在Hibernate可以借由inverse来设定,不设定inverse基本上也可以运行,但是效能会较差。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章