`
newleague
  • 浏览: 1509455 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

hibernate关联映射之逐步分析

阅读更多

 

一对一关联映射(单双向)


1 单向

主要是配置文件上的标签配置
比如对于person和idcard两个pojo类。
Person持有idcard的引用。在person.hbm.xml里,person的主键要来源于idcard类,也就是共享idcard的

主键。配置:<id name= "id">
<generator class="foreign(而不是原来的native)">
<param name="property(必须是这个)">idcard(用来关联到person类的idcard属性)</param>
</generator>
</id>
另外主要配置<one-to-one>标签,此标签的作用是指示hibernate怎么加载它的关联对象,默认根据主键加

载.
标签name属性是通过person类的idcard,关联到idcard类.
Constrained属性主要声明是外键约束.
<one-to-one name="idcard" constrained ="true">


2 双向
双向基本上是从单向演化而来.person.hbm.xml不变,在idcard.java里添加person引用,
在idcard.hbm.xml里加入<one-to-one>标签.
<one-to-one name="person"/>

 

二 多对一关联映射(单双向)


1 单向

多对一及其简单.
比如两个类,user和group.user为多的一方,group为一的一方,只要多的一方在类中持有一的一方的引用,

并且配置文件即user.hbm.xml里加入
<many-to-one name="group" column="groupid"/>
只这一句话便能建立起单向多对一关联映射.
但是,存储的时候要注意,先存一的一方,再存多的一方.
如果想让hibernate自动帮我们存储一的一方,那么就要修改上面的那句话:
<many-to-one name="group" column="groupid" cascade="all"/>
Cascade的意思是级联操作.有"all,save-update,delete,none",默认为none.
即如果要修改多的一方,那hibernate要先把一的一方改了.
这样我们只操作多的一方的增删查改就行了.

 

2 双向

看下面的一对多就知道,多对一和一对多是相对立的.
一对多关联映射利用了多对一关联映射原理

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

也就是说一对多和多对一的映射策略是一样的,只是站的角度不同

总的来说,在多的一方维护是比较好的.

三 一对多关联映射(单双向)


谁要对,那就在谁类里拿到对方的引用,那就再谁配置文件里配.


1 单向
还是两个类,class和student.

比起不用映射而言,student.hbm.xml不变,class.hbm.xml里多了的是:
<set name="students">
    <key column="classesid"/>
    <one-to-many class="Student"/>
   </set>
分析一下,用set标签的出发点是因为class类里持有student的引用(一个set集合),至于为什么是集合而不

是如以往的一个student直观的引用,是因为外键要设的不只是一个.如果不能理解,就直接理解为必须用

set标签就成了.
那么name属性是拿到引用,子标签key的column属性是在student里加一个字段,名字叫classesid,
而one-to-many标签是指向student类.
如果<hibernate-mapping package="com.bjsxt.hibernate">这样写,
那么在one-to-many标签直接跟类名.
需要注意的是,此时的one-to-many标签里不再像以前的one-to-one标签里用的是name属性而是class属性.

这两个属性的功能要分清楚.

单向一对多有缺点,因为要在一的一端维护,所以多的一段的表里的外键字段不可设为非空.
而且要发出多余的update语句.一般都设为双向的.下面来看双向.


2 双向
双向配置的话class.hbm.xml不变,在student类里持有class类的引用,student.hbm.xml文件配置添加:

<many-to-one name="classes" column="classesid(必须和class.hbm.xml里的<key

column="classesid"/>一致)"/>

这样配置就可以存储.
有三种存储方式.这是第一种.因为是一的一端维护,所以多发两条update.步骤是先挨个存student,再存

class.
第二种先存class,把classid字段存到student里,再挨个存student.也就是反转.class.hbm.xml里:
<set name="students" inverse="true">
第三种把classid字段存到student里,不存student.只存class. 也就是反转并级联操作.class.hbm.xml里

:<set name="students" inverse="true" cascade="all">

 

关于存储上,基本上就这三种.无论是一对多还是多对一.个人认为比较麻烦.具体应用的时候可以考虑改进

.
多对一的时候,因为站在多的立场,如果不级联,要先存一,把一的数据加到多里的引用,再存多.级联了,因

为不用考虑一的关系,所以只存多.
而一对多的时候,反转不级联,就站在多的立场.也要先存一再存多.反转只是立场转为多对一,所以同上.
反转并级联,也同上.不考虑一.
不反转也不级联,因为站在一的立场,就要先存多.把多加入到一的set集合,再存一.所以呢,立场和先存谁

是对立的.

请消化一下以上的总结.
下面来看多对多.

 

四 多对多关联映射(单双向)

 

1 单向.

多对多涉及到第三方表.hibernate会自动生成.一般权限上会用到,比如RBAC模型.
如以往一样,两个类,user和role.同样,user持有role的引用,是一个set集合.(如前面的一对多)
Role.hbm.xml没有变化, User.hbm.xml里多的是:
<set name="roles" table="t_user_role">
    <key column="userid"/>
    <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
   </set>
分析一下,set标签不用多说,table属性是指让hibernate自动建立第三方表名字叫"t_user_role",key标签

是指在此表中生成一个关联到本类(user的)叫userid的字段,
<many-to-many>标签里class属性引入类Role,并在t_user_role里生成一个关联到role的roleid字段.

在t_user_role表里,userid和roleid一并叫做复合主键.因为两者的联合有不可重复性.

其存储流程:1,存入role,2,用一个set集合接住role放到user的set里,(这里交叉存入比较容易看晕)3,挨

个存user.与上面的第二种存储方案差不多.
Load时候就简单,加载进来,在user里用一个遍历挨个从set里拿出来.就得到role表里的值.
执行存入的时候,hibernate就把表t_user_role各个值赋予了.


2 双向


基本上与单向一致.
Role里要持有user的引用,也是set集合,
Role.hbm.xml和user.hbm.xml配置差不多.
<set name="users" table="t_user_role" order-by="userid">
    <key column="roleid"/>
    <many-to-many class="com.bjsxt.hibernate.User" column="userid"/>
   </set>
注意两类对比,保持column属性值一致.

table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致

order-by="userid"属性是用来排序,按照t_user_role表的字段来排.

基本上,hibernate映射关系就是这些了.

 

分享到:
评论

相关推荐

    Hibernate初之单表映射学习例子

    "Hibernate初之单表映射学习例子" 这个标题表明我们将探讨的是Hibernate框架在处理单个数据库表映射的基础教程。Hibernate是Java开发中一个流行的对象关系映射(ORM)工具,它允许开发者用面向对象的方式来操作...

    hibernate对象关系映射实例

    描述中的“适合初学者”意味着我们将从基础开始,逐步讲解Hibernate的核心概念和用法。“对应关系有一对一,多对一,多对多”则提示我们将深入学习这三种常见的数据库关联关系在Hibernate中的实现方式。 **...

    02_传智播客hibernate教程_hibernate入门案例的细节分析

    10. **关联映射**:一對一、一对多、多对一、多对多的关系映射实现,包括@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等。 11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存...

    hibernate(基于MVC的服务器架构技术)

    对象关联映射是Hibernate的核心特性,它支持一对一、一对多、多对一和多对多等多种关联关系。通过配置映射文件,可以定义实体之间的关联,如外键、集合等。 ### 继承映射和容器映射 - **继承映射**:Hibernate支持...

    hibernateDemo

    【hibernateDemo】是一个关于Hibernate框架学习的项目,它主要涵盖了初学者在接触和理解Hibernate时会...你可以逐步学习,从配置到实体,再到查询和事务处理,最后深入到关联映射和缓存,逐步掌握Hibernate的核心功能。

    最经典的hibernate教程_从入门到精通(全四篇)

    本教程的【第一篇】将介绍Hibernate的基础知识和基本操作,【第二篇】会深入到关联映射和查询,【第三篇】涵盖性能优化和扩展性,而【第四篇】则聚焦于实际项目中的应用和问题解决。通过这四篇内容的学习,你将能够...

    hibernate_3.5.6_中文帮助文档(有目录)_Final.pdf

    在关联映射(Relational Mapping)部分,介绍了如何映射Person类,单向与双向关联,以及如何使关联工作。它详细解释了映射集合与值类型,双向关联和如何配置使双向关联有效。这部分内容对于理解对象之间的关联和导航...

    hibernate项目源代码

    【hibernate项目源代码】是一个...通过实际运行并分析这个项目,学习者可以逐步掌握Hibernate的各个方面,并将其应用到自己的项目中。同时,这也会为他们进一步学习Spring框架、MyBatis或其他ORM工具打下坚实的基础。

    传智播客-hibernate框架开发视频第day01-day04资料

    - 关联映射:深入学习一对一、一对多、多对一、多对多的关联映射,以及懒加载和立即加载策略。 - 改动追踪与脏检查:理解Hibernate如何检测对象状态的变化,自动执行更新操作。 - 异步操作与事务管理:学习如何在...

    MyEclipse+Hibernate快速入门中文版

    本教程将引导读者逐步完成一个简单的Java Hibernate应用的开发过程。主要内容包括: - 如何为Java项目添加MyEclipse Hibernate支持。 - 在项目中创建Hibernate配置文件。 - 如何使用自定义的SessionFactory。 - 如何...

    26. 尚硅谷_佟刚_Hibernate 课件及源代码

    2. "hibernate-3" - 可能是Hibernate框架的第三部分源代码,涵盖了高级特性,如关联映射、缓存机制、事务处理等,适合进阶学习者深入研究。 3. "hibernate-1" - 这是源代码的第一部分,可能包含Hibernate的初步设置...

    Hibernate相关资料

    这些关联关系的处理是ORM设计的关键,理解并熟练运用这些关联映射可以优化数据操作。 对于初学者来说,从基础教程开始,逐步掌握以下内容至关重要: - 安装和配置Hibernate环境,包括JDK、JDBC驱动、IDE集成等。 - ...

    Hibernate数据库操作实例.zip

    6. **关联映射**:学习一对一、一对多、多对一、多对多的关联映射,以及级联操作。 7. **延迟加载和立即加载**:理解Hibernate的懒加载机制,以及何时使用立即加载。 8. **事务管理**:了解Hibernate的Transaction...

    Hibernate上机实验1

    在实验中,你将通过MyProject这个项目,逐步实现以上步骤,理解并掌握Hibernate的基本用法。这将为你在实际开发中使用Hibernate打下坚实的基础。请确保每个步骤都理解透彻,并尝试解决可能出现的问题,以加深对ORM和...

    Hibernate入门(代码+笔记)

    本教程将分为五个部分,逐步深入Hibernate的世界。 **第一部分:Hibernate入门** 这部分主要介绍了Hibernate的基本概念和安装配置。Hibernate基于Java Persistence API(JPA),它提供了对象关系映射(ORM)功能,...

    hibernate框架基础教程适合新手

    Hibernate通过XML映射文件(例如`User.hbm.xml`)将Java类(如`User`)与数据库表进行关联。映射文件定义了字段与列的对应,以及主键、外键等关系。 4. **Session与Transaction** `SessionFactory`用于创建`...

    Hibernate 最新Jar包-3.5.6

    Hibernate是Java领域中一款广泛应用...对于初学者,建议首先了解Hibernate的基本概念和核心API,再逐步深入学习高级特性,如缓存、级联操作和关联映射等。同时,中文文档的提供使得学习过程更加顺畅,降低了理解门槛。

    hibernate学习课件

    **七、关联映射** 1. 一对一(One-to-One): 两个实体之间存在唯一的关系,例如用户和用户详细信息。 2. 一对多(One-to-Many): 一个实体可以关联多个其他实体,如教师与学生。 3. 多对一(Many-to-One): 多个...

    hibernate-tutorials_java_hibernate_Eclipse_fallenweg_

    本教程将详细介绍如何使用`@Entity`、`@Table`、`@Id`等注解,以及如何进行一对一、一对多、多对多等关联映射。 9. **查询语言(HQL)与 Criteria API** Hibernate提供了自己的查询语言HQL(Hibernate Query ...

    hibernate

    6. 关联映射:理解一对一、一对多、多对一和多对多的关联映射配置。 7. 集合映射:如List、Set、Map等集合类型的映射方法。 8. 事务管理:学习如何在Hibernate中处理事务,以及事务的隔离级别和回滚规则。 9. 性能...

Global site tag (gtag.js) - Google Analytics