【SSH】Hibernate学习(三)一对多、多对一、多对多

一、一对多,多对一

1、表及实体的表达



2、映射文件中的配置:



3、操作关联属性

public class Demo {
	
	@Test
	//保存客户以及客户下的联系人
	public void fun1() {
		//1.获得sesison
		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();
	}
}

4、进阶操作

(1)级联操作

在映射文件中的配置:

操作代码演示:
public class Demo2 {
	
	@Test
	//保存客户以及客户下的联系人
	//cascade:save-update
	public void fun1() {
		//1.获得sesison
		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();
	}
	
	@Test
	//测试删除客户时,级联删除客户下的联系人
	public void fun2() {
		//1.获得sesison
		Session session = HibernateUtils.openSession();
		//2.开启事务
		Transaction tx = session.beginTransaction();
		
		//3.操作
		//1>获得要操作的客户对象
		Customer c = session.get(Customer.class,1l);
		//2>调用delete删除客户
		session.delete(c);
		
		//4.提交事务
		tx.commit();
		//5.关闭资源
		session.close();
	}
}

(2)关系维护

双向关联会产生冗余的sql语句,所以为了提高性能可以只让一方在进行关系的维护,所以可以使用inverse属性来解决这个问题

二、多对多

1、表及实体的表达


2、多对多关系在映射文件当中的配置

开发中,遇到多对多关系,一定要选择一方放弃维护关系
由谁放弃看业务方向,例如录入员工时,需要为员工指定角色,那么业务方向是由员工维护角色,角色不需要维护与员工关系,所以角色放弃维护


操作代码:
/**
 * @author 
 * @date 2017年10月17日 下午4:52:58
 * @version V1.0
 * @Description: 多对多操作
 */
public class Demo {

	@Test
	// 保存客户以及客户下的联系人
	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();
	}

	@Test
	//为豆腐西施新增一个角色
	public void fun2() {
		// 1 获得session
		Session session = HibernateUtils.openSession();
		// 2 开启事务
		Transaction tx = session.beginTransaction();
		// -------------------------------------------------
		// 3操作
		//1>获得角色
		User u = session.get(User.class,3l);
		//2>创建一个豆腐店老板
		Role r = new Role();
		r.setRole_name("明星");
		//3>将角色添加到用户中
		u.getRoles().add(r);
		//4>将角色转化为持久化
		/*session.save(r);*/
		// -------------------------------------------------
		// 4提交事务
		tx.commit();
		// 5关闭资源
		session.close();
	}

	@Test
	//为豆腐西施解除一个角色
	public void fun3() {
		// 1 获得session
		Session session = HibernateUtils.openSession();
		// 2 开启事务
		Transaction tx = session.beginTransaction();
		// -------------------------------------------------
		// 3操作
		//1>获得角色
		User u = session.get(User.class,3l);
		Role r = session.get(Role.class, 3l);
		//2>将角色从用户的角色中删除
		u.getRoles().remove(r);
		// -------------------------------------------------
		// 4提交事务
		tx.commit();
		// 5关闭资源
		session.close();
	}
}


It's only after we've lost everything that we're free to do anything. 

只有我们失去所有才能随心而为。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦客子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值