双向一对多

Posted shiningarmor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向一对多相关的知识,希望对你有一定的参考价值。

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

以上是关于双向一对多的主要内容,如果未能解决你的问题,请参考以下文章

一对多双向性能问题

双向一对多

Hibernate JPA双向一对多结果与约束冲突异常

jpa休眠一对多双向[重复]

Mybatis 高级映射,一对一,一对多,多对多映射

映射一对多-02双向inverse