zoukankan      html  css  js  c++  java
  • hibernate 的 关联关系之多对一(一对多) 学习笔记

    关联关系:

    解释:

    关联关系--表示对象之间的关系,既有数量性,又有方向性;

    作用:将对象之间通过某种方式联系起来。

    关联的方向:

    关联关系的方向可分为单向关联和双向关联。

    双向关联的方向其实就不重要了,因为通过任一一方都可以维护彼此的关系。也就是说:在双向关联中一对多和多对一都是一样的。

    一:关联关系之多对一(单向关联)

    在关联标记例如<many-to-one>或者<one-to-many>,方向都是从左到右,换句话说是由左边维护它们的关系。

    栗子:<many-to-one > 

    即:多个员工对应一个部门。

    在员工表(EMP)中添加部门表(Dept)的Dept 的属性;

    从多的的一方查寻一的一方,即在Emp.hbm.xml 中配置<many-to-one >

    注意:column = “dno” 指明了dept表的外键

     然后在测试方法中单测:

    单向关联关系  1.根据员工编号查出员工部门名称

    @Test
        //单向关联关系  1.根据员工编号查出员工部门名称
        public void t1(){
            Session session = HibernateUtil.getSession();
    
            Emp emp = session.get(Emp.class, 9);
            System.out.println("员工名称:"+emp.getEname());
            System.out.println("员工所在部门:"+emp.getDept().getDname());
        }
    

      

    单向关联关系 2.保存部门和员工
    @Test
        //单向关联关系 2.保存部门和员工
        public void t2(){
    
            Session session = HibernateUtil.getSession();
            Transaction tx=session.beginTransaction();
    
            Dept dept=new Dept();
            dept.setDname("财务部4");
    
            Emp emp=new Emp();
            emp.setEname("周金龙4");
    
            emp.setDept(dept);
    
            session.save(dept);
            session.save(emp);
    
            tx.commit();
            session.close();
        }
    

      

    单向关联关系  3.按照指定的部门对象,查询相关的Emp对象
     @Test
        //单向关联关系  3.按照指定的部门对象,查询相关的Emp对象
        public void t3(){
            Session session = HibernateUtil.getSession();
    
            String hql="from Emp e where e.dept.dno=8";
            Query query = session.createQuery(hql);
            List<Emp> list = query.list();
    
            for (Emp item:list){
                System.out.println("员工名称:"+item.getEname());
            }
    
        }
    

      

    单向关联关系  4.输出指定的emps集合中的所有emp对象及其所关联的部门对象的信息
    @Test
        //单向关联关系  4.输出指定的emps集合中的所有emp对象及其所关联的部门对象的信息
        public void t4(){
            Session session = HibernateUtil.getSession();
            String hql="from Emp";
    
            Query query = session.createQuery(hql);
            List<Emp> list = query.list();
    
            for (Emp item:list){
                System.out.println("员工名称:"+item.getEname());
                System.out.println("员工所在部门:"+item.getDept().getDname());
                System.out.println("****************************");
            }
    
        }
    

      

    单向关联关系  5.修改编号为15的员工所属的部门
    @Test
        //单向关联关系  5.修改编号为15的员工所属的部门
        public void t5(){
            Session session = HibernateUtil.getSession();
    
            Transaction tx=session.beginTransaction();
            Emp emp = session.load(Emp.class, 15);
    
            Dept dept=new Dept();
            dept.setDno(10);
            emp.setDept(dept);
            tx.commit();
    
        }
    

      

    注意:单侧前要在大配置文件中关联小配置:

     一:关联关系之多对一(单向关联)

     在两边同时配置单向关联,就构成了双向管理。实际开发过程中,很多时候都是需要双向关联的,它在解决单向一对多维护关系的过程中存在的缺陷起了一定的修补作用。

    栗子:

    即:一个员工可能既是开发部也是测试部的。一个部门可以有张三或李四多个不同员工

    在Emp表中添加一个Set<Dept> 集合  

     在Dept.hbm.xml配置文件中加入<SET>

     

    测试类:

    一对多双向关联 1.查询各个部门下的员工
     @Test
        //一对多双向关联 1.查询各个部门下的员工
        public void t1(){
    
            //可以通过部门
            String hql="from Dept";
            Session session = HibernateUtil.getSession();
            Query query = session.createQuery(hql);
            List<Dept> list = query.list();
    
            for (Dept dept:list){
                System.out.println("部门名称:"+dept.getDname()+"--------------------------");
                for (Emp item:dept.getEmps()) {
                    System.out.println("员工名称:" + item.getEname());
                }
    
                System.out.println();
                System.out.println("********************************部门的分割线****************");
            }
    
        }
    

      

    02。级联  添加员工的同时添加部门
     @Test
        public void testSaveDeptAndEmp(){
            Session session=HibernateUtil.getSession();
            //事务的获取
            Transaction tx=session.beginTransaction();
    
            Dept dept=new Dept();
            dept.setDname("财务部4");
    
            Emp emp=new Emp();
            emp.setEname("呵呵呵4");
            //将部门的引入绑定到员工对象的一个属性上
            dept.getEmps().add(emp);
            emp.setDept(dept);
            session.save(dept);
            //session.save(emp);
            tx.commit();//事务提交操作
        }
    

      输出:

    Hibernate: 
        select
            hibernate_sequence.nextval 
        from
            dual
    Hibernate: 
        select
            hibernate_sequence.nextval 
        from
            dual
    Hibernate: 
        insert 
        into
            ANNAN.DEPT
            (dname, dno) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            ANNAN.EMP
            (ename, dno, eno) 
        values
            (?, ?, ?)
    Hibernate: 
        update
            ANNAN.EMP 
        set
            dno=? 
        where
            eno=?
    

      

  • 相关阅读:
    程序员如何利用空闲时间挣零花钱
    常见的数据交互之跳转页面传值
    一个能让cin和scanf 一样快的方法:
    HDU 4901 DP
    POJ 2823 线段树 Or 单调队列
    POJ 3264 线段树 ST
    POJ 3468 线段树+状压
    POJ 2777 线段树
    QQ 临时会话+图标 HTML代码
    POJ 1463 Strategic game
  • 原文地址:https://www.cnblogs.com/ruiannan/p/8136710.html
Copyright © 2011-2022 走看看