zoukankan      html  css  js  c++  java
  • 双向一对多

    双向一对多是many-to-one的双方都有用注解来维持关联关系;
    many的一方:
         @JoinColumn(name="d_id")
         @ManyToOne(fetch=FetchType.LAZY)
         private Dept dept;
    one的一方:
         //一对多关联
         @JoinColumn(name="d_id")
         @OneToMany
         private Set<Emp> empSet;
    注意:双方的关联关系的@JoinColumn注解里的name属性规定的外键名必须一样;例如这里都为 d_id;
     
    1.插入
    代码:
         @Test
         public void testInsert(){
               Emp e1=new Emp();
               e1.setBirthday(new Date());
               e1.setName("诸葛村夫");
               e1.setSalary(2000);
               Emp e2=new Emp();
               e2.setBirthday(new Date());
               e2.setName("王司徒");
               e2.setSalary(5000);
               Dept dept=new Dept();
               dept.setDname("文官");
               Set set=new HashSet<Emp>();
               set.add(e1);
               set.add(e2);
               dept.setEmpSet(set);
               //执行保存操作
               manager.persist(e1);
               manager.persist(e2);
               manager.persist(dept);
         }
    结果:
    Hibernate:
        insert
        into
            tb_emp
            (birthday, d_id, name, salary)
        values
            (?, ?, ?, ?)
    Hibernate:
        insert
        into
            tb_emp
            (birthday, d_id, name, salary)
        values
            (?, ?, ?, ?)
    Hibernate:
        insert
        into
            tb_dept
            (dname)
        values
            (?)
    Hibernate:
        update
            tb_emp
        set
            birthday=?,
            d_id=?,
            name=?,
            salary=?
        where
            id=?
    Hibernate:
        update
            tb_emp
        set
            birthday=?,
            d_id=?,
            name=?,
            salary=?
        where
            id=?
    Hibernate:
        update
            tb_emp
        set
            d_id=?
        where
            id=?
    Hibernate:
        update
            tb_emp
        set
            d_id=?
        where
            id=?
    可以看出:如果先保存many的一端,后保存one的一端,会多出4条update语句;
    因为两边都维护关联关系;先保存Emp,由于此时还没有Dept,所以没有外键;
    Dept插入后,由dept维护关联关系,发出两条update语句,给Emp加上外键;
    Emp自身也要维护关联关系,也发出两条update语句;
     
    如果先插入one的一方后插入many的一方则只会多出两条update语句;
    这是由于one的一方先插入,many的一方插入时外键已经有了;
    one的一方为了维护关联关系会发出两条update语句;
    而many的一方不会再发出update语句;
    Hibernate:
        insert
        into
            tb_dept
            (dname)
        values
            (?)
    Hibernate:
        insert
        into
            tb_emp
            (birthday, d_id, name, salary)
        values
            (?, ?, ?, ?)
    Hibernate:
        insert
        into
            tb_emp
            (birthday, d_id, name, salary)
        values
            (?, ?, ?, ?)
    Hibernate:
        update
            tb_emp
        set
            d_id=?
        where
            id=?
    Hibernate:
        update
            tb_emp
        set
            d_id=?
        where
            id=?
     
    在进行双向一对多关联关系时,最好只用many的一方来维护关联关系,这样可以避免没有必要的update语句;
    可以在one的一端的实体类注解@OneToMany上加上属性mappedBy将关联关系交给one的一方;
    mappedBy属性的值为many一端one类属性的属性名;
    注意:此时one的一端的@JoinColumn注解必须去掉,不然会报错;
         //一对多关联
         //@JoinColumn(name="d_id")
         @OneToMany(mappedBy="dept")
         private Set<Emp> empSet;
    结果:
    Hibernate:
        insert
        into
            tb_dept
            (dname)
        values
            (?)
    Hibernate:
        insert
        into
            tb_emp
            (birthday, d_id, name, salary)
        values
            (?, ?, ?, ?)
    Hibernate:
        insert
        into
            tb_emp
            (birthday, d_id, name, salary)
        values
            (?, ?, ?, ?)
     
     
     
  • 相关阅读:
    Spring 事务不回滚
    Druid详细配置信息
    Servlet和JSP规范及版本对应关系
    CDN(内容分发网络)技术原理
    开发者需要了解的WebKit
    浏览器的渲染原理简介
    在浏览器中输入Google.com并且按下回车之后发生了什么?
    为什么说DOM操作很慢
    亿级Web系统搭建——单机到分布式集群
    linux下用rinetd做端口转发
  • 原文地址:https://www.cnblogs.com/ShiningArmor/p/10600171.html
Copyright © 2011-2022 走看看