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双向多对多对象关系模型映射的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 双向多对多映射关系

Hibernate映射多对多双向关联关系(小案例)

Hibernate学习———— 双向多对多映射关系

hibernate学习四 hibernate关联关系映射

hibernate------映射相关

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联