Hibernate多表关联

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

<many-to-onename="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-valuenull的设定 

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

例如:<set name="users" table="USER">
            <keycolumn="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-onename="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)
、通过主键进行关联:限制两个数据表的主键使用相同的值,如此一个UserRoom就是一对一关系
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"iinverse="true" cascade="all">
             <key column="room_id"/>
              <one-to-manyclass="onlyfun.caterpillar.User"/>

在设立双向关联时,关联由多对一中「多」的哪一方维护,会比由「一」的哪一方维护来的方便,在Hibernate可以藉由inverse来设定,不设定inverse基本上也可以运行,但是效能会较差。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值