@JoinColumn
Hibernate的@OneToMany和@ManyToOne都可以用@JoinColumn。@JoinColumn有name属性需要设置成为多的一方的外键,当@OneToMany用@JoinColumn时,表示一的一方控制关联关系,并且@OneToMany设置了cascade=CascadeType.ALL,这时删除一端时不会抛出异常,多端外键被设置为null。
主控制方在一端,
也就是在一端set多端的时候,数据库会为你保存级联关系(在多端指向一端的外键设置值了)。
SClass c=new SClass();
c.getStudents().add(s);
c.getStudents().add(s1);
session.save(c);mappedBy
Hibernate的@OneToMany可以用mappedBy。@ManyToOne没有该属性,mappedBy有name属性需要设置成为“多”方class类里的“一”方的变量名,当@OneToMany用mappedBy时表示多方控制关联关系。
如果保存设置一端的属性保存时,多端中一端的外键会设置为null。
Java代码
//多方:
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name=”cid”)
public Classroom getClassroom() {
return classroom;
}
public void setClassroom(Classroom classroom) {
this.classroom = classroom;
}
Java代码
//一方
@OneToMany(mappedBy=”classroom”)
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
这样只有一条插入语句:
Hibernate: insert into Classroom (cname) values (?)
为了更好地说明问题,我把以上一方的配置进行修改
加入了 cascade=CascadeType.ALL
同样执行以上代码 显示插入了两条:
Hibernate: insert into Classroom (cname) values (?)
Hibernate: insert into User (cid, uname, upass) values (?, ?, ?)
但是查看数据库就会发现:
虽然插入了..但是外键却没有值
一方不维护关系就可以明显的看出来.
但是一方的其他不影响关系的更新操作是没有问题的:
Java代码 收藏代码
Classroom cr=(Classroom)session.get(Classroom.class, 1);
System.out.println(cr.getUsers().iterator().next().getUname());
cr.getUsers().iterator().next().setUname(“XX”);
执行以上的代码:
显示:
Hibernate: select classroom0_.cid as cid1_0_, classroom0_.cname as cname1_0_ from Classroom classroom0_ where classroom0_.cid=?
Hibernate: select users0_.cid as cid1_1_, users0_.uid as uid1_, users0_.uid as uid0_0_, users0_.cid as cid0_0_, users0_.uname as uname0_0_, users0_.upass as upass0_0_ from User users0_ where users0_.cid=?Hibernate: update User set cid=?, uname=?, upass=? where uid=?数据在数据库里也被正常更新
@JoinColumn和mappedBy都不用时会生成一个中间表。
Hibernate中@OneToMany与ManyToOne的mappedBy和@JoinColumn区别
最新推荐文章于 2024-08-06 23:47:41 发布