Hibernate对象关系映射----关联映射(二)
2012-07-11 07:45
344 查看
一对一主键关联映射(单向Person---->IdCard)
原理:让两个实体的主键一样,这样就不需要加入多余的字段了。
举例:一个人(Person)拥有一张身份证(IdCard)。
Person类的映射文件Person.hbm.xml。
从对象模型中看,Person类持有IdCard的引用。从配置看,<one-to-one>指示hibernate如何加载关联对象,默认根据主键加载,也就是拿到关系字段值,根据对端的主键来加载关联对象。Constrained=”true”表示,当前主键(person的主键)还是一个外键,参照了对端的主键(IdCard的主键),也就是会生成外键约束语句。
一对一主键关联映射(双向Person<---->IdCard)
原理:与上面单项相同,只是需要两端都需要维护。
举例:同上。
Person的映射文件不变,和上面相同。IdCard的映射文件IdCard.hbm.xml。
在对象模型中,Person和IdCard各自都持有对方的引用,在配置方面,需要在IdCard加入<one-to-one>标签,只是hibernate将关联对象Person根据主键加载上来。<one-to-one>不影响存储,只影响加载。
一对一唯一外键关联映射(单向Person---->IdCard)
原理:一对一唯一外键关联映射其实是多对一的特例,因此和上篇讲过的原理相同。
举例:同上。
Person对象映射文件Person.hbm.xml。
采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一。
一对一唯一外键关联映射(双向Person<---->IdCard)
原理:同上。
举例:同上。
Person映射文件不变,和上面相同。IdCard的映射文件IdCard.hbm.xml。
从对象模型看,双方都各自持有对方的引用。从配置看,一对一唯一外键关联双向采用<one-to-one>标签映射,必须指定<one-to-one>标签中的property-ref属性为关系字段的名称,它表示本类(IdCard)的主键将会与关联类(Person)的此属性(idCard)相对应。
多对多关联映射(单向User---->Role)
原理:一般的设计中,多对多关联映射,需要一个中间表,将两个表中的主键放到中间表中做一个关联。
举例:一个用户(User)对多个角色(Role),一个角色对多个用户。
User对象的映射文件User.hbm.xml。
多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的。<set>标签中用table属性重命名中间表名称,<key>标签定义当前表的主键,用<many-to-many>标签来关联另一张表。
多对多关联映射(双向User<---->Role)
原理:同上。
举例:同上。
User对象的映射文件和上面相同。Role的映射文件Role.hbm.xml。
多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。
关联关系到此就结束了,咋一看Hibernate的关联关系一大堆,搞得人发晕,但是把这些归纳起来,并分类汇总理解就非常简单了。
原理:让两个实体的主键一样,这样就不需要加入多余的字段了。
举例:一个人(Person)拥有一张身份证(IdCard)。
Person类的映射文件Person.hbm.xml。
<hibernate-mapping> <class name="com.snail.hibernate.Person" table="t_person"> <id name="id"> <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> <generator class="foreign"> <!-- property只关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
从对象模型中看,Person类持有IdCard的引用。从配置看,<one-to-one>指示hibernate如何加载关联对象,默认根据主键加载,也就是拿到关系字段值,根据对端的主键来加载关联对象。Constrained=”true”表示,当前主键(person的主键)还是一个外键,参照了对端的主键(IdCard的主键),也就是会生成外键约束语句。
一对一主键关联映射(双向Person<---->IdCard)
原理:与上面单项相同,只是需要两端都需要维护。
举例:同上。
Person的映射文件不变,和上面相同。IdCard的映射文件IdCard.hbm.xml。
<hibernate-mapping> <class name="com.snail.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person"/> </class> </hibernate-mapping>
在对象模型中,Person和IdCard各自都持有对方的引用,在配置方面,需要在IdCard加入<one-to-one>标签,只是hibernate将关联对象Person根据主键加载上来。<one-to-one>不影响存储,只影响加载。
一对一唯一外键关联映射(单向Person---->IdCard)
原理:一对一唯一外键关联映射其实是多对一的特例,因此和上篇讲过的原理相同。
举例:同上。
Person对象映射文件Person.hbm.xml。
<hibernate-mapping> <class name="com.snail.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>
采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一。
一对一唯一外键关联映射(双向Person<---->IdCard)
原理:同上。
举例:同上。
Person映射文件不变,和上面相同。IdCard的映射文件IdCard.hbm.xml。
<hibernate-mapping> <class name="com.snail.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>
从对象模型看,双方都各自持有对方的引用。从配置看,一对一唯一外键关联双向采用<one-to-one>标签映射,必须指定<one-to-one>标签中的property-ref属性为关系字段的名称,它表示本类(IdCard)的主键将会与关联类(Person)的此属性(idCard)相对应。
多对多关联映射(单向User---->Role)
原理:一般的设计中,多对多关联映射,需要一个中间表,将两个表中的主键放到中间表中做一个关联。
举例:一个用户(User)对多个角色(Role),一个角色对多个用户。
User对象的映射文件User.hbm.xml。
<hibernate-mapping package="com.snail.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="Role" column="role_id"/> </set> </class> </hibernate-mapping>
多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的。<set>标签中用table属性重命名中间表名称,<key>标签定义当前表的主键,用<many-to-many>标签来关联另一张表。
多对多关联映射(双向User<---->Role)
原理:同上。
举例:同上。
User对象的映射文件和上面相同。Role的映射文件Role.hbm.xml。
<hibernate-mapping package="com.snail.hibernate"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role"> <key column="role_id"/> <many-to-many class="User" column="user_id"/> </set> </class> </hibernate-mapping
多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。
关联关系到此就结束了,咋一看Hibernate的关联关系一大堆,搞得人发晕,但是把这些归纳起来,并分类汇总理解就非常简单了。
相关文章推荐
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- Hibernate一对一双向关联映射
- hibernate之关于一对多单向关联映射
- hibernate之关于多对一单向关联映射
- hibernate基础(六)--多对多关联映射
- hibernate一对多关联映射——双向(非常常用)
- Hibernate映射—— 多对多关联映射
- Hibernate从入门到精通(十)多对多单向关联映射
- 【Hibernate】——单向关联映射
- Hibernate 一对一关联映射对象 级联增删改查示例
- Hibernate之1-N关联映射
- Hibernate从入门到精通(十一)多对多双向关联映射
- 【Hibernate框架】关联映射(一对一关联映射)
- 【Hibernate系列】(六):关联映射之一对多
- Hibernate多对多关联映射
- Hibernatel框架关联映射
- hibernate多对一关联映射(cascade的使用)
- 【Hibernate】多对一关联映射
- hibernate 关联映射 双向多对一(一对多)
- 【SSH进阶之路】Hibernate映射——多对多关联映射(八)