Hibernate 基本映射
一对一
一个账户一个地址
Account Address
主键表 外键表 [在Address 对应的表中建一个外键]
独立主键:
One: Account
<one-to-one name=”addr” property-ref=”act” cascade=”all” />
主键表如何找到外键的一方呢?通过property-ref指定,
Many:Address
<many-to-one class=”act” column=”fid” cascade=”save-update” unique=”true”/>
外键表如何找到与对方的关联呢?通过coulumn指定的外键与对方关联
共享主键:
One:Account
<one-to-one name=”addr” cascade=”all” />
对应addr与对方进行关联,通过addr对应表的主键与对象关联
One:Address
//自身的主键来源于对方的主键
<generator calss=”foreign’>
<param name=”perproty”>act</property>
</generator>
<one-to-one name=”act” constranted=”true” />
当前主键上存在一个约束,当前主键作为外键参照了对方的主键
在保存对象之前要先保存Account,如果不先保存Account,直接保存Address 会报:TransitentObjectException
Address 中的OID即是主键又是外键
一对多:
Usr Act
OID Name Set<Account> OID actNo balance Usr usr
多的一方会采用Set集合表示对方的引用 通过一个usr引用对方
数据库处理上,需要在多的一方加上一个外键,根据上面就是在 Act对应的表中加一个外键
Usr
<set name="actSet" cascade="all" inverse="true">
<!--指定外键 -->
<key column="fid"/> //通过外键与多的一方进行关联
<one-to-many class="Act" /> //指定集合元素中的类型
</set>
Act
<!--多对一的关联 通过一个外键与对方关联 -->
<many-to-one name="usr"
column="fid"
cascade="save-update"/>
多对多关联处理:
学生与课程之间是多对多的关联
Student Course
采用中间表的方式解决这样的关联关系
我们创建一个中间表来描述学生的选课情况.
Stu Course
Oid Sid name Set<Course> Oid Cid name Set<Stu>
T_Stu T_stu_cour T_course
Sid name oid f1 f2 Oid name cid
Stu:
<set name="cours" table="lilp_stu_cour" cascade="save-update">
<!--外键约束学生表的ID -->
<key column="sfid"/> //通过这个外键与Stu关联
<!--外键约束课程表的ID --> //通过这个外键与课程关联
<many-to-many class="Course" column="cfid" />
</set>
Course:
<set name="stus" table="lilp_stu_cour" cascade="save-update" inverse="true">
<!--外键约束课程表的ID -->
<key column="cfid"/> //通过外键与课程关联
<!--外键约束学生表的ID --> //通过外键与学生关联
<many-to-many class="Stu" column="sfid" />
</set>
组件关系映射
单一组件关联映射中,映射的都是单独的Pojo 之间的映射
比如:Act------------------Address
现在我们这样看:Address 属于地址 Act包含地址的信息
Act (整体) Address (地址) [非PO]
失去独立性的POJO
Act Address
Oid actNo bal Address Oid zipcode city street Act act
T_Act
Bal actNo oid oid zip city street {已经不是一个实体了,所以不必要写映射
文件了}
一对一的组件关联映射
<component name="addr"> //添加组件属性
<property name="zipcode"
column="ZIPCODE"/>
<property name="city"
column="CITY"/>
<property name="street"
column="STREET"/>
</component>
一对多的组件关联映射
<set name="addrs" table="lilp_addr_comp">
<!--lilp_addr_comp 表的外键,引用Account 表的主键 -->
<key column="fid"/> //组件对象会放在一线表中,通过外键与主对象进行关联
<composite-element class="Address">
<property name="zipcode"
column="ZIPCODE"/>
<property name="city"
column="CITY"/>
<property name="street"
column="STREET"/>
</composite-element>
</set>