Hibernate双向多对多对象关系模型映射
Posted 光何
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate双向多对多对象关系模型映射相关的知识,希望对你有一定的参考价值。
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 }
1.4.5 给已有项目分配新员工
1 /***
2 * 给已有的项目,分配新的员工(新入职)
3 * ***/
4 @Test
5 public void saveProjectEmp2()
6 {
7 //获得Session
8 Session session=sf.openSession();
9 //开启事务
10 Transaction tr=session.beginTransaction();
11 //start:所有的数据改动都是改动内存中的数据
12 //获得项目对象
13 Project p= (Project) session.get(Project.class, 4);
14 //获得项目的所有员工
15 Set<Emp> emps=p.getEmps();
16 //创建新的员工对象
17 Emp emp= new Emp();
18 emp.setEname("小强4");
19 //将emp员工对象,添加某个项目对应的员工集合中
20 emps.add(emp);
21 emp.getPros().add(p);//inverse=true;由员工建立和项目的关系
22 //end:当提交事务的时候,本次数据库操作会话需要结束,hibernate自动检查内存中的数据是否和数据库中的一致
23 //如果不一致,会将内存中的数据同步到数据
24 //提交事务
25 tr.commit();
26 //释放资源
27 session.close();
28 }
1.4.6通过员工查询项目
员工姓名 项目名称
1 /***
2 * 查询员工姓名 项目名称
3 * 关联查询:默认延迟加载
4 * a b c
5 * ***/
6 @Test
7 public void selectProjectEmp()
8 {
9 //获得Session
10 Session session=sf.openSession();
11 //查询所有的员工
12 List<Emp> elist = session.createCriteria(Emp.class).list();
13 for(Emp e:elist){
14 //获得员工参与的项目的集合
15 Set<Project> pros = e.getPros();
16 for(Project p:pros){
17 System.out.println(e.getEname()+"\\t\\t"+p.getPname());
18 }
19 }
20 //释放资源
21 session.close();
22 }
1.4.7总结
Cascade:继续有效,很少delete,常用save-update
Inverse:必须由一方这是为true反转
中间关系表:
建立关系:insert
断开关系:delete
以上是关于Hibernate双向多对多对象关系模型映射的主要内容,如果未能解决你的问题,请参考以下文章