Hibernate框架-多对多

一、关系表达

表中:使用中间表,至少两列都是外键列,分别引用两张表的主键

对象中:两方都使用集合来表达拥有多个对方

orm元数据:

<!-- 多对多关系表达 -->
<!-- 
	name: 集合属性名
	table: 配置中间表名
	key
		|-column:外键,别人引用"我"的外键列名
		class: 我与哪个类是多对多关系
		column:外键.我引用比人的外键列名
-->
<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>

二、操作关联属性

1、操作关联属性:

public void fun1(){
	//1 获得session
	Session session = HibernateUtils.openSession();
	//2 开启事务
	Transaction tx = session.beginTransaction();
	//-------------------------------------------------
	//3操作
	//1> 创建两个 User
	User u1 = new User();
	u1.setUser_name("大神");
		
	User u2 = new User();
	u2.setUser_name("小白");
		
	//2> 创建两个 Role
	Role r1 = new Role();
	r1.setRole_name("专家");
		
	Role r2 = new Role();
	r2.setRole_name("助理");
	//3> 用户表达关系
	u1.getRoles().add(r1);
	u1.getRoles().add(r2);
		
	u2.getRoles().add(r1);
	u2.getRoles().add(r2);
		
	//4> 角色表达关系
	r1.getUsers().add(u1);
	r1.getUsers().add(u2);
		
	r2.getUsers().add(u1);
	r2.getUsers().add(u2);
		
	//5> 调用Save方法一次保存
	session.save(u1);
	session.save(u2);
	session.save(r1);
	session.save(r2);
	//-------------------------------------------------
	//4提交事务
	tx.commit();
	//5关闭资源
	session.close();
}
2、为大神新增一个角色
//1> 获得大神用户
User user = session.get(User.class, 1l);
//2> 创建CEO角色
Role r = new Role();
r.setRole_name("CEO");
//3> 将角色添加到用户中
user.getRoles().add(r);
//4> 将角色转换为持久化
session.save(r);
3、为大神解除角色
//1> 获得大神用户
User user = session.get(User.class, 1l);
//2> 获得要操作的角色对象(CEO,专家)
Role r1 = session.get(Role.class, 1l);
Role r2 = session.get(Role.class, 2l);
//3> 将角色从用户的角色集合中移除
user.getRoles().remove(r1);
user.getRoles().remove(r2);


三、操作进阶

1、inverse属性

<!-- 使用inverse属性
	true: 放弃维护外键关系
	false(默认值):维护关系
			
        结论: 将来在开发中,如果遇到多对多关系.一定要选择一方放弃维护关系.
	    一般谁来放弃要看业务方向. 例如录入员工时,需要为员工指定所属角色.
	    那么业务方向就是由员工维护角色. 角色不需要维护与员工关系.角色放弃维护
 -->		
<set name="users" table="sys_user_role" inverse="true" >
	<key column="role_id" ></key>
	<many-to-many class="User" column="user_id" ></many-to-many>
</set>

2、级联属性

<!-- cascade级联操作:
	save-update: 级联保存更新
	delete:级联删除
	all:级联保存更新+级联删除
	结论: cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update.
	    如果使用delete操作太过危险.尤其在多对多中.不建议使用.
-->
<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值