hibernate-03表的关系

1.一对多 | 多对一

关系表达:Customer表种一个客户对应着Linkman表中的多个联系人

 

1>在数据库中的表达:Customer的主键是Linkman中的外键(主外键联系),有外键的一般是多的一方

 

2>在domain实体类中的表达:一对多的一方使用集合(表达含有多个),多对一的一方直接引用即可(表达属于那一方)(Set集合不重复)

3>orm元数据中的表达:1-1-1

name属性:自己实体类集合属性名 、column属性: 自己表中外键列名、class属性: 对方实体

一对多:一的方Customer
<set name="linkmans">
 	<key column="lkm_cust_id"></key>
 	<one-to-many class="Linkman"/>
 </set>
多对一:多的一方Linkman
<many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>

4>操作关联属性:

保存两个表的操作
Customer ct = new Customer();
ct.setCust_name("i3-8100");
		
Linkman lk = new Linkman();
lk.setLkm_name("ceo");
lk.setCustomer(ct);//表达对多,联系人属于哪个客户
Linkman lk2 = new Linkman();
lk2.setLkm_name("coo");
lk2.setCustomer(ct);//表达对多,联系人属于哪个客户

ct.getLinkmans().add(lk);//表达一对多,客户下有多个联系人
ct.getLinkmans().add(lk2);
		
session.save(ct);//保存操作
session.save(lk);
session.save(lk2);
删除联系人操作
//1> 获得要操作的客户对象
Customer c = session.get(Customer.class,1l);
//2> 获得要移除的联系人
LinkMan lm = session.get(LinkMan.class, 3l);
//3> 将联系人从客户集合中移除
c.getLinkMens().remove(lm);
lm.setCustomer(null);
单一保存联系人操作
//1> 获得要操作的客户对象
Customer c = session.get(Customer.class,1l);
//2> 创建联系人
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("郝强勇");
//3> 将联系人添加到客户,将客户设置到联系人中
c.getLinkMens().add(lm1);
lm1.setCustomer(c);
//4> 执行保存
session.save(lm1);

5>进阶操作:级联属性cascade、关系维护inverse

cascade级联操作: 简化操作.目的就是为了少些两行代码.

inverse属性: 性能优化.提高关系维护的性能.原则: 无论怎么放弃,总有一方必须要维护关系. 一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃.

        <!-- 一对多表Customer -->
 		<!-- 
			name属性:集合属性名
			column属性: 外键列名
			class属性: 与我关联的对象完整类名
		 -->
		  <!-- 
		 	级联操作:	cascade
		 		save-update: 级联保存更新
		 		delete:级联删除
		 		all:save-update+delete
		  -->
		  <!-- inverse属性: 配置关系是否维护. 
		  		true: customer不维护关系
		  		false(默认值): customer维护关系
		  -->
 		<set name="linkmans" cascade="delete" inverse="true">
 			<key column="lkm_cust_id"></key>
 			<one-to-many class="Linkman"/>
 		</set>


        <!-- 多对一表Linkman -->
        <many-to-one name="customer" column="lkm_cust_id" class="Customer" cascade="save-update"></many-to-one>

2.多对多关系

关系表达:一个用户对应多个角色,一个角色对应多个用户

多对多关系中必须有一方放弃关系维护:inverse="true"

 

1>在数据库中的表达

数据库中使用多对多关系时,我们会创建一个第三方的关系表来表达多对多关系

 

2>在domain实体中的表达

双方都是用Set集合来表达多对多的对应关系(Set集合不重复)

 

3>在orm元数据中的表达:2-1-2

name属性:自己实体类集合属性名 、table:第三方关系表名、column属性(key): 自己表中外键列名、class属性: 对方实体名、column属性(many):对方表中外键列名

<--两方配置相方即可-->
<set name="roles" table="sys_user_role" cascade="save-update">
	<key column="user_id"></key>
	<many-to-many class="Role" column="role_id"></many-to-many>
</set>

 

4>关系操作

与一对多相同

5>进阶操作

与一对多相同:多对多关系中必须有一方放弃关系维护:inverse="true"

猜你喜欢

转载自blog.csdn.net/langao_q/article/details/81950069
今日推荐