1 双向many-to-many
业务模型:
描述员工和项目
一个员工同时可以参与多个项目
一个项目中可以包含多个员工
分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成many-to-many
1 create table emp 2 ( 3 eno int primary key auto_increment, 4 ename varchar 5 ); 6 create table project 7 ( 8 pid int primary key auto_increment, 9 pname varchar, 10 ); 11 create table relationship 12 ( 13 eno int, 14 pid int, 15 );
1.1 描述java的数据模型
1.2进行pojo的映射配置
1.3加载配置文件产生数据库模型
在数据库为两个主外键。
1.4进行CRUD操作
1.4.1 添加员工信息
1 @Test 2 public void testSaveEmp() 3 { 4 Session session = HibernateSessionFactory.getSession(); 5 //开启事务 6 Transaction tr = session.beginTransaction(); 7 //创建员工对象 8 Emp emp = new Emp(); 9 emp.setEname("毛主席"); 10 session.save(emp); 11 tr.commit(); 12 session.close(); 13 }
1.4.2添加项目信息
1 @Test 2 public void testSaveProject() 3 { 4 Session session = HibernateSessionFactory.getSession(); 5 //开启事务 6 Transaction tr = session.beginTransaction(); 7 //创建员工对象 8 Project p = new Project(); 9 p.setPname("渡江战役"); 10 session.save(p); 11 tr.commit(); 12 session.close(); 13 }
1.4.3添加项目同时分配员工
新添加项目,将项目分配给已经存在的员工
1 /** 2 * 添加项目数据,分配已有员工 3 * ****/ 4 @Test 5 public void saveProjectEmp() 6 { 7 //获得Session 8 Session session=sf.openSession(); 9 //开启事务 10 Transaction tr=session.beginTransaction(); 11 //创建项目对象 12 Project p= new Project(); 13 p.setPname("CRM"); 14 //查询员工的对象 15 List<Emp> elist = session.createCriteria(Emp.class).list(); 16 //将员工分配给新项目:给中间表插入数据 17 p.setEmps(new HashSet(elist)); 18 session.save(p); 19 //提交事务 20 tr.commit(); 21 //释放资源 22 session.close(); 23 }
1.4.4解除员工和项目的关系
通过员工解除关系的。
1 /*** 2 * 解除员工和项目的关系 3 * 删除中间表中的数据 4 * ***/ 5 @Test 6 public void deleteProjectEmp() 7 { 8 //获得Session 9 Session session=sf.openSession(); 10 //开启事务 11 Transaction tr=session.beginTransaction(); 12 //查询员工对象 13 Emp emp = (Emp) session.get(Emp.class, 1); 14 //获得员工参与的所有项目 15 Set<Project> pros=emp.getPros(); 16 System.out.println(pros); 17 //查询项目对象 18 Project p=(Project) session.get(Project.class,3); 19 System.out.println(p); 20 /**** 21 * 22 * set集合中元素的地址和单条查询获得项目对象的地址一样,所有set集合中的项目对象和 23 * 单条查询获得的项目对象,是同一个对象,所以pros.remove(p),删除了集合中地址和p一样的对象 24 * 25 * *****/ 26 //p.equals(obj); 27 //从pros中删除某个项目 28 /*** 29 * 现在关系是由员工断开(默认inverse=false) 30 * many-to-many这种情况:保存其中一方的inverse=true 31 * ***/ 32 pros.remove(p);// 33 //提交事务 34 tr.commit(); 35 //释放资源 36 session.close(); 37 }
时间: 2024-11-10 15:45:04