级联关系
- 一对多
- 多对一
- 一对一
- 多对多
好处:
加载其中一个实体的时候,可以直接使用实体所关联的其他实体
单项的多对一(使用的频率最高)
实现步骤
1.修改实体类
a.去掉实体类生成的外键
b.增加“一”的一方最为成员变量(getter和setter)
2.修改映射文件
a.去掉原有的关联外键的property配置
b.增加many-to-one标签
<many-to-one name="class1" column="cId" />
单向的多对一关联
修改多的一方的实体类 Book
private Author aid;
getter/setter
修改映射文件
<many-to-one name="aId" column="aId"/>
加载多的一方(Book)与其关联的对象是延迟加载
什么时候使用非oid之外的其他属性是才会数据库真正的查询
生成的对象时代理对象(Author)
单向的一对多关联
实体类:Author1
//必须是接口类型,因为真实类型是Hibernate重写的,如果定义
//成具体的实现类会发现强制类型转换异常
private Set<Book1> book = new HashSet<Book1>();
映射文件
<set name="book">
<key column="BID1" ></key>
<one-to-many class="cn.wang.entity.Book1" />
</set>
双向的多对一/一对多
多:
Emp.java
private Dept dept;
Emp.hbm.xml
<many-to-one name="dept" column="deptno"/>
一:
Dept.java
private Set<Emp> emps = new HashSet<Emp>();
Dept.hbm.xml
<set name="emps" inverse="true">
<key>
<column name="deptno"/>
</key>
<one-to-many class="cn.wang.entity.Emp"/>
</set>
关联操作
set标签的cascade属性:级联操作
none,默认值
save-update,级联所有的保存和更新操作
delete,级联删除,删除部门的时候删除员工
all,级联所有操作
set标签的inverse属性:
inverse:默认值是false,谁是false谁主动维护双方的级联关系
推荐:在1的一方将inverse设置为true:
效率高
可读性高
双向的一对一关联
表结构:
Address:{ aid,aname}
Person1:{ pid,pname,aid(fk)}
实体类
Address:{ aid,aname,Person1}
Person1:{ pid,pname,Address}
映射文件
Person1:
<many-to-one name="address" column="AID" unique="true"></many-to-one>
Address:
<!-- name:对方的对象,property-ref:与对方对象一对一关联的对象:person.address -->
<one-to-one name="person" property-ref="address" cascade="all"></one-to-one>
双向的多对多关联
表结构
Project:{pid,pname}
Developer:{did,dname}
Dev_pro_relation:{did,pid}
实体类:
Developer:
private Set Project = new HashSet(0);
Project:
private Set Developer = new HashSet(0);
映射文件:
Developer:
<set name="project" inverse="true" table="Dev_pro_relation">
<key>
<column name="did"></column>
</key>
<many-to-many entity-name="cn.wang.entity.Project">
<column name="pid"></column>
</many-to-many>
</set>
Project:
<set name="developer" table="Dev_pro_relation" cascade="all">
<key>
<column name="pid"></column>
</key>
<many-to-many entity-name="cn.wang.entity.Developer">
<column name="did"></column>
</many-to-many>
</set>
基于主键的一对一
表结构
Person2{pid(pk),pname}
Address2{aid(pk,fk),aname}
实体类
Person2
private Address2 address;
Address2
private Person2 person;
映射文件
Person2
<one-to-one name="address" cascade="all"/>
Address2
<class name="cn.wang.entity.Address2" table="Address2">
<id name="aid" column="aid">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="aname" column="aname"/>
<one-to-one name="person" constrained="true"></one-to-one>
</class>
配置基于连接表的单向的一对多关联
表结构
Address3:{ aid,aname}
Person3:{ pid,pname}
Person_Address:{aid,pid}
实体类
Person3
private Set<Address3> address = new Hash<Address3>();
映射文件
Person.hbm.xml
--配置基于连接表的单向的一对多关联
<set name="address" table="Person_Address" cascade="all">
--指定连接表的连接键
<key>
<column name="pid"></column>
</key>
--column :连接表关联Address的外键
<many-to-many>
<column name="aid" class="cn.wang.entity.Address3" unique="true"/>
</many-to-many>
</set>
配置基于连接表的双向的一对多/多对一关联
表结构
Address3:{ aid,aname}
Person3:{ pid,pname}
Person_Address:{aid,pid}
实体类
Person3
private Set<Address3> address = new Hash<Address3>();
Address3
private Person3 person;(getter/setter)
映射文件
Person3.hbm.xml
--配置基于连接表的单向的一对多关联
<set name="address" table="Person_Address" cascade="all">
--指定连接表的连接键
<key>
<column name="pid"></column>
</key>
--column :连接表关联Address的外键
<many-to-many>
<column name="aid" class="cn.wang.entity.Address3" unique="true"></column>
</many-to-many>
</set>
Address3.hbm.xml
<join table="Person_Address" optional="true">
<key name="aid"></key>
--这个name 对应的是Address3里面的Person
<many-to-one name="person" column="pid"></many-to-one>
</join>
基于连接表的双向一对一关联,少用
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190328155954970.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDAzNjQ0MQ==,size_16,color_FFFFFF,t_70)