- 浏览: 900023 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
1、hibernate多对一关联映射
关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用
User.java里面包含Group.java定义的group应用
- User.java:
- private int id;
- private String name;
- private Group group;
- -------------------------------------
- Group.java:
- private int id;
- private String name;
User.java: private int id; private String name; private Group group; ------------------------------------- Group.java: private int id; private String name;
<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致
<many-to-one>标签的定义示例:
* <many-to-one name="group" column="groupid"/>
例:User.hbm.xml配置:
- <hibernate-mapping>
- <class name="com.hibernate.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <!-- 理解级联的含义是对象的连锁操作
- <many-to-one name="group" column="groupid" cascade="all"/>
- -->
- <many-to-one name="group" column="groupid"/>
- </class>
- </hibernate-mapping>
- 数据库里是t_user表里创建groupid 字段,并创建一个外键,groupid字段reference t_group表里的id字段。
<hibernate-mapping> <class name="com.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 理解级联的含义是对象的连锁操作 <many-to-one name="group" column="groupid" cascade="all"/> --> <many-to-one name="group" column="groupid"/> </class> </hibernate-mapping> 数据库里是t_user表里创建groupid 字段,并创建一个外键,groupid字段reference t_group表里的id字段。
2、hihernate一对多关联映射(单向Classes----->Student)
一对多关联映射利用了多对一关联映射原理
区别:
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同
- Classes.java:
- private int id;
- private String name;
- private Set students;
- -----------------------------
- Student.java
- private int id;
- private String name;
Classes.java: private int id; private String name; private Set students; ----------------------------- Student.java private int id; private String name;
classes.hbm.xml的配置:
- <hibernate-mapping package="com.hibernate">
- <class name="Classes" table="t_classes">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="students">
- <key column="classesid"/>
- <one-to-many class="Student"/>
- </set>
- </class>
- </hibernate-mapping>
- 数据库里:t_student表里创建classesid字段,并创建外键,classesid字段reference t_classes表里的id;
<hibernate-mapping package="com.hibernate"> <class name="Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students"> <key column="classesid"/> <one-to-many class="Student"/> </set> </class> </hibernate-mapping> 数据库里:t_student表里创建classesid字段,并创建外键,classesid字段reference t_classes表里的id;
在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
所以需要发出多余的update语句来更新关系
3.hihernate一对多关联映射(双向Classes<----->Student)
一对多双向关联映射:
* 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
* 在多一端采用<many-to-one>
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系
关于inverse属性:
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
如果设置成inverse为true,则我们只能从多一端来维护关联关系
注意:inverse属性,只影响数据的存储,也就是持久化
inverse和cascade
* inverse是关联关系的控制方向
* cascade操作上的连锁反应
- Classes.java
- private int id;
- private String name;
- private Set students;
- ------------------------------
- Student.java
- private int id;
- private String name;
- private Classes classes;
- ------------------------------
- Classes.hbm.xml配置:
- <hibernate-mapping package="com.hibernate">
- <class name="Classes" table="t_classes">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="students" inverse="true" cascade="all">
- <key column="classesid"/>
- <one-to-many class="Student"/>
- </set>
- </class>
- </hibernate-mapping>
- --------------------------------
- Student.hbm.xml配置
- <hibernate-mapping>
- <class name="com.hibernate.Student" table="t_student">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <many-to-one name="classes" column="classesid"/>
- </class>
- </hibernate-mapping>
- 数据库里:t_student表里创建classesid字段,并创建外键,classesid字段reference t_classes表里的id;
Classes.java private int id; private String name; private Set students; ------------------------------ Student.java private int id; private String name; private Classes classes; ------------------------------ Classes.hbm.xml配置: <hibernate-mapping package="com.hibernate"> <class name="Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students" inverse="true" cascade="all"> <key column="classesid"/> <one-to-many class="Student"/> </set> </class> </hibernate-mapping> -------------------------------- Student.hbm.xml配置 <hibernate-mapping> <class name="com.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="classes" column="classesid"/> </class> </hibernate-mapping> 数据库里:t_student表里创建classesid字段,并创建外键,classesid字段reference t_classes表里的id;
4、hibernate一对一主键关联映射(单向关联Person---->IdCard)
一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建
- Person.java
- private int id;
- private String name;
- private IdCard idCard;
- -----------------------------
- Person.hbm.xml
- <hibernate-mapping>
- <class name="com.hibernate.Person" table="t_person">
- <id name="id">
- <!-- person的主键来源idCard,也就是共享idCard的主键 -->
- <generator class="foreign">
- <param name="property">idCard</param>
- </generator>
- </id>
- <property name="name"/>
- <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
- constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard
- <one-to-one name="idCard" constrained="true"/>
- </class>
- </hibernate-mapping>
- -----------------------------
- IdCard.java
- private int id;
- private String cardNo;
- -----------------------------
- IdCard.hbm.xml
- <hibernate-mapping>
- <class name="com.hibernate.IdCard" table="t_idcard">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="cardNo"/>
- </class>
- </hibernate-mapping>
- 数据库里: t_person的主键来源t_idcard,也就是共享t_idcard的主键,数据库里不例外增加一作为外键的字段。
Person.java private int id; private String name; private IdCard idCard; ----------------------------- Person.hbm.xml <hibernate-mapping> <class name="com.hibernate.Person" table="t_person"> <id name="id"> <!-- person的主键来源idCard,也就是共享idCard的主键 --> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载, constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping> ----------------------------- IdCard.java private int id; private String cardNo; ----------------------------- IdCard.hbm.xml <hibernate-mapping> <class name="com.hibernate.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping> 数据库里: t_person的主键来源t_idcard,也就是共享t_idcard的主键,数据库里不例外增加一作为外键的字段。
5、hibernate一对一主键关联映射(双向关联Person<---->IdCard)
需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person
默认根据主键加载
- Person.java
- private int id;
- private String name;
- private IdCard idCard;
- -----------------------------
- Person.hbm.xml配置
- <hibernate-mapping>
- <class name="com.hibernate.Person" table="t_person">
- <id name="id">
- <!-- person的主键来源idCard,也就是共享idCard的主键 -->
- <generator class="foreign">
- <param name="property">idCard</param>
- </generator>
- </id>
- <property name="name"/>
- <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
- constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard
- -->
- <one-to-one name="idCard" constrained="true"/>
- </class>
- </hibernate-mapping>
- -----------------------------
- IdCard.java
- private int id;
- private String cardNo;
- private Person person;
- -----------------------------
- IdCard.hbm.xml
- <hibernate-mapping>
- <class name="com.hibernate.IdCard" table="t_idcard">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="cardNo"/>
- <one-to-one name="person"/>
- </class>
- </hibernate-mapping>
- 数据库里: t_person的主键来源t_idcard,也就是共享t_idcard的主键,数据库里不例外增加一作为外键的字段。
Person.java private int id; private String name; private IdCard idCard; ----------------------------- Person.hbm.xml配置 <hibernate-mapping> <class name="com.hibernate.Person" table="t_person"> <id name="id"> <!-- person的主键来源idCard,也就是共享idCard的主键 --> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载, constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard --> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping> ----------------------------- IdCard.java private int id; private String cardNo; private Person person; ----------------------------- IdCard.hbm.xml <hibernate-mapping> <class name="com.hibernate.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person"/> </class> </hibernate-mapping> 数据库里: t_person的主键来源t_idcard,也就是共享t_idcard的主键,数据库里不例外增加一作为外键的字段。
6.hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)
一对唯一外键关联映射是多对一关联映射的特例
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联
- Person.xml
- private int id;
- private String name;
- private IdCard idCard;
- ------------------------------
- Person.hbm.xml
- <hibernate-mapping>
- <class name="com.hibernate.Person" table="t_person">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <[color=red]many-to-one name[/color]="idCard" [color=red]unique="true"[/color]/>
- </class>
- </hibernate-mapping>
- ------------------------
- IdCard.java
- private int id;
- private String cardNo;
- ------------------------
- IdCard.hbm.xml
- <hibernate-mapping>
- <class name="com.hibernate.IdCard" table="t_idcard">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="cardNo"/>
- </class>
- </hibernate-mapping>
- 数据库里:t_person里产生一个idcard的外键,reference t_idcard表里的主键id。并指定这个字段为unique(核心:就是many-to-one,只不过外键被约束为唯一的。),
Person.xml private int id; private String name; private IdCard idCard; ------------------------------ Person.hbm.xml <hibernate-mapping> <class name="com.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <[color=red]many-to-one name[/color]="idCard" [color=red]unique="true"[/color]/> </class> </hibernate-mapping> ------------------------ IdCard.java private int id; private String cardNo; ------------------------ IdCard.hbm.xml <hibernate-mapping> <class name="com.hibernate.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping> 数据库里:t_person里产生一个idcard的外键,reference t_idcard表里的主键id。并指定这个字段为unique(核心:就是many-to-one,只不过外键被约束为唯一的。),
7、hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载
其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,
所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:
<one-to-one name="person" property-ref="idCard"/>
- Person.java
- private int id;
- private String name;
- private IdCard idCard;
- ------------------------------
- <hibernate-mapping>
- <class name="com.hibernate.Person" table="t_person">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <many-to-one name="idCard" unique="true"/>
- </class>
- </hibernate-mapping>
- ------------------------------
- IdCard.java
- private int id;
- private String cardNo;
- private Person person;
- ------------------------------
- <hibernate-mapping>
- <class name="com.hibernate.IdCard" table="t_idcard">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="cardNo"/>
- <one-to-one name="person" property-ref="idCard"/>
- </class>
- </hibernate-mapping>
- 数据库里:
Person.java private int id; private String name; private IdCard idCard; ------------------------------ <hibernate-mapping> <class name="com.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="idCard" unique="true"/> </class> </hibernate-mapping> ------------------------------ IdCard.java private int id; private String cardNo; private Person person; ------------------------------ <hibernate-mapping> <class name="com.hibernate.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person" property-ref="idCard"/> </class> </hibernate-mapping> 数据库里:
8、hibernate多对多关联映射(单向User---->Role)
具体映射方式:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.hibernate.Role" column="roleid"/>
</set>
- User.java
- private int id;
- private String name;
- private Set roles;
- ----------------------------
- User.hbm.xml
- <hibernate-mapping>
- <class name="com.hibernate.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="roles" table="t_user_role">
- <key column="userid"/>
- <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
- </set>
- </class>
- </hibernate-mapping>
- ----------------------------
- Role.java
- private int id;
- private String name;
- ----------------------------
- Role.hbm.xml
- <hibernate-mapping>
- <class name="com.hibernate.Role" table="t_role">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
- </hibernate-mapping>
- 数据库里:产生第三个表,t_user_role,有2个字段分别为:userid和roleid
User.java private int id; private String name; private Set roles; ---------------------------- User.hbm.xml <hibernate-mapping> <class name="com.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="userid"/> <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/> </set> </class> </hibernate-mapping> ---------------------------- Role.java private int id; private String name; ---------------------------- Role.hbm.xml <hibernate-mapping> <class name="com.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping> 数据库里:产生第三个表,t_user_role,有2个字段分别为:userid和roleid
9.hibernate多对多关联映射(双向User<---->Role)
映射方法:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.hibernate.Role" column="roleid"/>
</set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致
- Person.java
- private int id;
- private String name;
- private Set roles;
- <hibernate-mapping>
- <class name="com.hibernate.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="roles" table="t_user_role">
- <key column="userid"/>
- <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
- </set>
- </class>
- </hibernate-mapping>
- ---------------------------------------------
- Role.java
- private int id;
- private String name;
- private Set users;
- <hibernate-mapping>
- <class name="com.hibernate.Role" table="t_role">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="users" table="t_user_role" order-by="userid">
- <key column="roleid"/>
- <many-to-many class="com.bjsxt.hibernate.User" column="userid"/>
- </set>
- </class>
- </hibernate-mapping>
- 数据库里:
Person.java private int id; private String name; private Set roles; <hibernate-mapping> <class name="com.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="userid"/> <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/> </set> </class> </hibernate-mapping> --------------------------------------------- Role.java private int id; private String name; private Set users; <hibernate-mapping> <class name="com.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role" order-by="userid"> <key column="roleid"/> <many-to-many class="com.bjsxt.hibernate.User" column="userid"/> </set> </class> </hibernate-mapping> 数据库里:
发表评论
-
hibernate n+1问题
2010-10-21 11:05 899Hibernate中常会用到set,bag等集合表示1对多的关 ... -
Hibernate 关联关系 总结
2010-09-09 15:27 9391.一对多的单向关联关系 配置单向的一对多关系是 ... -
Hibernate一对多(单向)
2010-09-09 14:31 570[正文]: Hibernate一对多关联,例如一个用户有 ... -
Hibernate中No row with the given identifier exists问题的原因及解决
2010-06-23 09:54 910产生此问题的原因: ... -
Hibernate使用count(*)取得表中记录总数(跨Hibernate3.x版本问题)
2010-06-22 17:13 1506Java代码 /** * @T ... -
hibernate继承关系映射
2010-06-13 16:58 888hbn 的继承映射关系有这 ... -
Hibernate集合映射
2010-06-13 12:49 894准备找工作,重新整理一下Hibernate,今天做了集合映射 ... -
高并发网站的架构
2010-05-07 11:07 698我在CERNET做过拨号接入平台的搭建,而后在Yaho ... -
Hibernate事务和并发控制
2010-05-07 10:21 8881. 事务介绍:1.1. 事务的定义:事务就 ... -
hibernate中lazy的使用
2009-12-18 22:00 755lazy,延迟加载 Lazy的 ... -
Hibernate中代码自动生成功能小结
2009-12-06 15:10 1006Hibernate中需要class和mapping file, ... -
hibernate工具箱—根据映射文件自动建表
2009-12-04 12:08 960public class ExportDB { ... -
关联加载对象时的报错-----a different object with the same identifier value
2009-11-18 16:13 852因为在hibernate中同一个session里面有了两个相同 ... -
update/saveOrUpdate/merge
2009-11-18 15:28 1125通常下面的场景会使用update()或saveOrUpdate ... -
写得很不错的-Hibernate中的实体状态(二)
2009-11-18 15:08 933(2)session.merge ()方法 ... -
写得很不错的-Hibernate中的实体状态(一)
2009-11-18 15:04 1122持久层的解决方案有许 ... -
Hibernate3.x总结
2009-11-18 14:29 729Hibernate不是盏省油的灯 ... -
Hibernate Annotation几种关联映射
2009-11-02 17:01 1054Hibernate Annotation几种关联映射 一对一 ... -
hibernate3的注解映射学习
2009-11-02 16:41 1322注解映射必须满足两大条件:Hibernate3.2以上版本和J ... -
Hibernate 中级联操作 cascade 选项
2009-11-02 16:35 908none :在保存、更新或删除对象时,忽略其他关联的对象。他是 ...
相关推荐
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
Hibernate关联关系练习【全】
hibernate关联关系
映射一对多关联关系 以Customer和Order为例: 一对多: 每个Customer可以有一个或者多个Order,因此Customer中应该有一个集合类型的属性,来引用所有关联的Order对象。 多对一。全实例讲解
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
hibernate关联查询 实例源码 java web 如果不明白hibernate关联查询不明白的可以看看,保证马上学会,注释,数据库都有,很简单易学的源码,谢谢下载!
Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...
Hibernate 关联关系映射分类
文件中包含关于hibernate 各个属性的解释
Hibernate关联关系.docHibernate关联关系.doc
Hibernate关联关系总结 一对多 多对一 多对多
大致总结了一下Hibernate关联关系。提供相关的一些例子进行测试。
Hibernate关联关系映射.CHM Hibernate文档相关
hibernate关联关系简单项目,也可以只运行Java文件不用JSP页面,运用MySQL
关于对Hibernate关联映射的一个总结,其中有各种映射的例子,详细用法 等
Hibernate关联关系映射实例速查,帮助初学者学习。
Hibernate关联映射.doc
hibernate关联关系多对一实例