Hibernate_学习笔记_级联关系

级联关系

  1. 一对多
  2. 多对一
  3. 一对一
  4. 多对多
    好处:
    加载其中一个实体的时候,可以直接使用实体所关联的其他实体

单项的多对一(使用的频率最高)

实现步骤
	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>

基于连接表的双向一对一关联,少用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值