码迷,mamicode.com
首页 > 其他好文 > 详细

双向一对多

时间:2019-03-26 15:25:33      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:private   -o   void   4条   mapped   插入   属性的属性   fetch   hda   

双向一对多是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
        (?, ?, ?, ?)
 
 
 

双向一对多

标签:private   -o   void   4条   mapped   插入   属性的属性   fetch   hda   

原文地址:https://www.cnblogs.com/ShiningArmor/p/10600171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!