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