Hibernate框架-一对多和多对一

一、关系表达

表中的表达

实体中的表达


orm元数据中表达

一对多:

<!-- 集合,一对多关系,在配置文件中配置 -->
<!-- 
	name属性:集合属性名
	column属性: 外键列名
	class属性: 与我关联的对象完整类名
-->
<set name="linkMens" >
	<key column="lkm_cust_id" ></key>
	<one-to-many class="LinkMan" />
</set>

多对一:

<!-- 多对一 -->
<!-- 
	name属性:引用属性名
	column属性: 外键列名
	class属性: 与我关联的对象完整类名
-->
<many-to-one name="customer" column="lkm_cust_id" class="Customer"  >
</many-to-one>


二、操作关联属性

1、保存客户 以及客户 下的联系人

public void fun1(){
	//1 获得session
	Session session = HibernateUtils.openSession();
	//2 开启事务
	Transaction tx = session.beginTransaction();
	//-------------------------------------------------
	//3操作
	Customer c = new Customer();
	c.setCust_name("计算机");
	
	LinkMan lm1 = new LinkMan();
	lm1.setLkm_name("大神");
	
	LinkMan lm2 = new LinkMan();
	lm2.setLkm_name("小白");
	
	//表达一对多,客户下有多个联系人
	c.getLinkMens().add(lm1);
	c.getLinkMens().add(lm2);
		
	//表达多对一,联系人属于哪个客户
	lm1.setCustomer(c);
	lm2.setCustomer(c);
	
	session.save(c);
	session.save(lm1);
	session.save(lm2);
		
        //-------------------------------------------------
	//4提交事务
	tx.commit();
	//5关闭资源
	session.close();
}

2、为客户增加联系人

//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);

3、为客户删除联系人

//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、级联操作:简化操作,一定要用,save-update,不建议使用delete

<!-- 
	级联操作:	cascade
	save-update: 级联保存更新
	delete:级联删除
	all:save-update+delete
	级联操作: 简化操作.目的就是为了少些两行代码.
-->

2、关系维护


在保存时,两方都会维护外键关系。关系维护两次,冗余了。 多余的维护关系语句,显然是客户这一端在维护关系


<!-- inverse属性: 配置关系是否维护. 
	true: customer不维护关系
	false(默认值): customer维护关系
		  		
	inverse属性: 性能优化.提高关系维护的性能.
	原则: 无论怎么放弃,总有一方必须要维护关系.
	一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃.
-->

猜你喜欢

转载自blog.csdn.net/w_meng_h/article/details/80258288