zoukankan      html  css  js  c++  java
  • 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()+"		"+p.getPname());
    18         }
    19     }
    20     //释放资源
    21     session.close();
    22 }

    1.4.7总结

          Cascade:继续有效,很少delete,常用save-update

          Inverse:必须由一方这是为true反转

          中间关系表:

               建立关系:insert

               断开关系:delete

  • 相关阅读:
    树的一些操作
    线程池的概念
    线程池
    BLOB字段来保存fastreport的报表模板
    D7调用XE2 中间层注意事项
    xe2 datasnap中间层+d7客户端调用
    关于延迟时间的一点智慧

    插件
    phpstorm clone 码云项目到本地 Version Control 不显示
  • 原文地址:https://www.cnblogs.com/guanghe/p/6097204.html
Copyright © 2011-2022 走看看