Hibernate_day03---表与表关系建立、一对多配置及操作、多对多配置及操作

版权声明:转载请联系作者本人!!! https://blog.csdn.net/qq_41307491/article/details/82845505

一、表与表关系建立思路


一对多关系

关系举例:
(1)分类和商品关系。
		一个分类里面有多个商品,一个商品只能属于一个分类
(2)公司和员工关系
		一个公司有多个员工,每个员工属于一个公司

一对多建表:通过外键建立关系

图示:
在这里插入图片描述

多对多关系

关系举例:
(1) 人与角色关系
		一个人有多个角色(学生,儿子,青年),一个角色可以有多个人(张三、李四、王五)

多对多建表:创建第三张表维护关系

图示
在这里插入图片描述

二、一对多环境配置


客户和联系人:客户是一,联系人是多。

第一步 创建两个实体类,客户和联系人。
//客户
	public class Customer {
		private Integer cid;  //客户id
		private String custName; //客户名称
		private String custLevel;  //客户级别
		private String custSource;  //客户来源
		private String custPhone;  //联系电话
		private String custMobile;  //手机
	}
	
//联系人
	public class LinkMan {
		private Integer lkm_id; // 联系人编号(主键)
		private String lkm_name;// 联系人姓名
		private String lkm_gender;// 联系人性别
		private String lkm_phone;// 联系人办公电话
	}
第二步 让两个实体类之间互相表示
//Hibernate要求用Set集合存放多的一方,泛型为多的类。
	
	//多对一中的一 (客户)
	private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
	public Set<LinkMan> getSetLinkMan() {
		return setLinkMan;
	}
	public void setSetLinkMan(Set<LinkMan> setLinkMan) {
		this.setLinkMan = setLinkMan;
	}

//在多中,创建一的类。用来表示所属关系  (一个联系人只能有一个客户)
	
	//多对一中的多(联系人)
	private Customer customer;
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
第三步 配置映射关系
1)完成基本配置(每个实体类分别对应一个映射文件)
2)配置一对多映射关系(使用set标签)	

在客户映射文件中,表示所有联系人
在这里插入图片描述
在联系人映射文件中,表示所属客户
在这里插入图片描述

第四步 创建核心配置文件,把映射文件引入到核心配置文件中

在这里插入图片描述
建表,测试配置
在这里插入图片描述

三、一对多级联操作


级联保存
(1)复杂写法:

	/**
	 * HibernateOneToMany
	 * 添加客户添加联系人测试
	 * 
	 * @author 一万年行不行
	 */
	public class HibernateOneToMany {
		
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction transaction = null;
		@Test
		public void oneToMany(){
			try{
				//1.得到sessionFactory创建表.
				sessionFactory = HibernateUtils.getSessionFactory();
				
				//2.得到session
				session = sessionFactory.openSession();
				
				//3.调用session开启事务
				transaction = session.beginTransaction();	
				/*
				 * 4.业务逻辑---添加客户
				 * 
				 * 1.创建客户、
				 * 2.创建联系人、
				 * 3.将联系人设置到客户、
				 * 4.为联系人设置客户
				 * 5.保存到数据库
				 */
				//创建客户
				Customer customer = new Customer();
				customer.setCustName("百度");
				customer.setCustLevel("vip");
				customer.setCustSource("网络");
				customer.setCustPhone("123456");
				customer.setCustMobile("5555");
				
				//创建联系人
				LinkMan linkman = new LinkMan();
				linkman.setLkm_name("lucy");
				linkman.setLkm_gender("男");
				linkman.setLkm_phone("911");
				
				//将联系人设置到客户、
				customer.getSetLinkMan().add(linkman);
				
				//为联系人设置客户
				linkman.setCustomer(customer);
				
				//保存到数据库
				session.save(customer);
				session.save(linkman);
				
				//5.提交事务
				transaction.commit();
			}catch(Exception e){
				//5.事务回滚
				transaction.rollback();
			}finally{
				//6.关闭资源
				session.close();
				//sessionFactory.close();
			}
		}
	}

测试
在这里插入图片描述在这里插入图片描述

(2)简化写法
	简化内容:只需要在客户添加联系人即可,不再需要双向保存

在这里插入图片描述在这里插入图片描述

级联删除

第一步 在客户映射文件set标签,进行配置
	使用属性cascade属性值 delete

在这里插入图片描述

第二步 在代码中直接删除客户
	根据id查询对象,调用session里面delete方法删除

在这里插入图片描述

修改操作(inverse属性)

(1)因为hibernate双向维护外键。
	导致系统需要修改两次外键(客户和联系人都需要维护外键),造成效率问题

在这里插入图片描述

(2)解决方式:让其中的一方不维护外键(多对一中的一)

在这里插入图片描述

四、多对多映射配置


以用户和角色为例演示

第一步 创建实体类,用户和角色

第二步 让两个实体类之间互相表示
(1)一个用户里面表示所有角色,使用set集合

在这里插入图片描述

(2)一个角色有多个用户,使用set集合

在这里插入图片描述

第三步 配置映射关系
(1)基本配置
(2)配置多对多关系

在这里插入图片描述

第四步 在核心配置文件中引入映射文件

在这里插入图片描述
建表 测试配置:
在这里插入图片描述

五、多对多操作


级联保存

第一步 在用户配置文件中set标签进行配置,cascade值save-update
在这里插入图片描述

第二步 代码实现

(1)创建用户和角色对象,把角色放到用户里面,保存用户
	//演示多对多修级联保存
	@Test
	public void testSave() {
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction tx = null;
		try {
			//得到sessionFactory
			sessionFactory = HibernateUtils.getSessionFactory();
			//得到session
			session = sessionFactory.openSession();
			//开启事务
			tx = session.beginTransaction();
			
			//添加两个用户,为每个用户添加两个角色
			//1 创建对象
			User user1 = new User();
			user1.setUser_name("lucy");
			user1.setUser_password("123");
			
			User user2 = new User();
			user2.setUser_name("mary");
			user2.setUser_password("456");
			
			Role r1 = new Role();
			r1.setRole_name("总经理");
			r1.setRole_memo("总经理");
			
			Role r2 = new Role();
			r2.setRole_name("秘书");
			r2.setRole_memo("秘书");
			
			Role r3 = new Role();
			r3.setRole_name("保安");
			r3.setRole_memo("保安");
			
			//2 建立关系,把角色放到用户里面
			// user1 -- r1/r2
			user1.getSetRole().add(r1);
			user1.getSetRole().add(r2);
			
			// user2 -- r2/r3
			user2.getSetRole().add(r2);
			user2.getSetRole().add(r3);
			
			//3 保存用户
			session.save(user1);
			session.save(user2);
			
			//提交事务
			tx.commit();

		}catch(Exception e) {
			tx.rollback();
		}finally {
			session.close();
			//sessionFactory不需要关闭
			sessionFactory.close();
		}
	}

在这里插入图片描述

级联删除
第一步 在set标签进行配置,cascade值delete
第二步 删除用户

在这里插入图片描述在这里插入图片描述

#六、维护第三张表关系

用户和角色多对多关系,维护关系通过第三张表维护

1)产生关系
	第一步 根据id查询用户和角色
	第二步 把角色放到用户里面

在这里插入图片描述

2)删除关系
	第一步 根据id查询 用户和角色
	第二步 去掉用户中的角色

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/82845505