【Hibernate】——多对一关联映射
2016-04-27 19:57
351 查看
在了解了hibernate基本映射机制之后,很好的就会切入到多对一映射当中。多对一关联映射最重要的标签是<many-to-one>.
Hibernate的多对一关联映射实现的基本原理就是:在多的一端加入一个外键,指向一的一端,映射完成之后使得加载多的一端数据的同时能把关联的一的一端的数据加载上来。
public class User {
private int id;
private String name;
private Group group;
public int getId() {
return id;
}
public void setId(int id) {
this. id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this. group = group;
}
}
Group作为一的一端:
public class Group {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this. id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
}
映射文件:
Group:
User:
同时不要忘了在hibernate的核心配置文件hibernate.cfg.xml中引入这两个映射文件。
[align=left] 从两个映射文件可以看出,多对一的关联映射只需要在多的一端配置一个<many-to-one>标签就可以了,如User类的配置成的表得groupid指向一的一端的外键。[/align]
[align=left]
[/align]
[align=left] 或者还可以设置级联操作:在多的一端的<many-to-one>标签设置级联属性:[/align]
[align=left] 这样就标识级联保存和级联更新,就不用再显示save(group)了,hibernate会首先保存User的关联对象Group,达到自动保存的效果。[/align]
[align=left]
[/align]
[align=left]Cascade可以的取值为:[/align]
[align=left] all:标识所有情况都进行级联操作[/align]
[align=left] none:不进行级联操作[/align]
[align=left] save-update:保存或更新时进行级联操作[/align]
[align=left] delete:级联删除[/align]
[align=left]
[/align]
[align=left] 级联是对象之间的连锁操作,它只影响添加、删除和修改。因为是多对一,存在外键关联问题,所以需要设置级联属性。而且多对一关联映射只有一种方向。不管是哪种关联,只要分清楚各种不同关联的特殊标签和属性就好。[/align]
Hibernate的多对一关联映射实现的基本原理就是:在多的一端加入一个外键,指向一的一端,映射完成之后使得加载多的一端数据的同时能把关联的一的一端的数据加载上来。
两个类实现多对一的关联映射的步骤
User作为多的一端:public class User {
private int id;
private String name;
private Group group;
public int getId() {
return id;
}
public void setId(int id) {
this. id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this. group = group;
}
}
Group作为一的一端:
public class Group {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this. id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
}
映射文件:
Group:
<hibernate-mapping> <class name ="com.bjpowernode.hibernate.Group" table= "t_group"> <id name ="id"> <generator class ="native"/> </id > <property name ="name"/> </class > </hibernate-mapping>
User:
<hibernate-mapping> <class name ="com.bjpowernode.hibernate.User" table= "t_user"> <id name ="id"> <generator class ="native"/> </id > <property name ="name"/> <many-to-one name ="group" column="groupid" cascade= "save-update"/> </class > </hibernate-mapping>
同时不要忘了在hibernate的核心配置文件hibernate.cfg.xml中引入这两个映射文件。
<mapping resource= "com/bjpowernode/hibernate/User.hbm.xml" /> <mapping resource= "com/bjpowernode/hibernate/Group.hbm.xml" />
[align=left] 从两个映射文件可以看出,多对一的关联映射只需要在多的一端配置一个<many-to-one>标签就可以了,如User类的配置成的表得groupid指向一的一端的外键。[/align]
[align=left]
[/align]
注意:
[align=left] User是多的一端,Group是一的一端,所以保存数据时,需要先保存Group,让Transient状态的Group对象变成Persisent状态,才能保存User,因为只有Group变成了Persistent状态之后User对象才能获取到Group的主键作为外键关联,Persistent状态的对象不能引用Transient状态的对象。[/align][align=left] 或者还可以设置级联操作:在多的一端的<many-to-one>标签设置级联属性:[/align]
<many-to-one name ="group" column="groupid" cascade= "save-update"/>
[align=left] 这样就标识级联保存和级联更新,就不用再显示save(group)了,hibernate会首先保存User的关联对象Group,达到自动保存的效果。[/align]
[align=left]
[/align]
[align=left]Cascade可以的取值为:[/align]
[align=left] all:标识所有情况都进行级联操作[/align]
[align=left] none:不进行级联操作[/align]
[align=left] save-update:保存或更新时进行级联操作[/align]
[align=left] delete:级联删除[/align]
[align=left]
[/align]
[align=left] 级联是对象之间的连锁操作,它只影响添加、删除和修改。因为是多对一,存在外键关联问题,所以需要设置级联属性。而且多对一关联映射只有一种方向。不管是哪种关联,只要分清楚各种不同关联的特殊标签和属性就好。[/align]
相关文章推荐
- android---读取SD卡内容并显示
- java_web servlet第二课
- 从数组中取出n个元素的所有组合(递归实现)
- PHP中界定符的使用
- linux安装phpredis扩展
- android---重写textview自适应屏幕分辨率,压缩字体大小
- PHP pdo编码乱码问题的解决方法
- android---重写EditText自适应屏幕分辨率,压缩字体大小
- seekg前记得手动清除EOF标志位
- 颓废了好久 拾起当初的梦 虚幻4初学 我要做我自己的游戏
- nginx 后端服务器配置端口 request.getserverPort
- android---世界时区列表
- IO库总结——C++Primer第八章
- HDOJ 2063 过山车【匈牙利算法求二分图最大匹配 DFS增广 BFS增广】
- ionic入门教程第十三课-多级分类列表的简单实现
- Android 批量上传图片进度回调
- Java的网络编程-Socket编程
- HDU 1532 最大流模板题
- 团队作业四
- android---对SharePreferences的封装