hibernate的关系映射

2024-09-03 10:48
文章标签 关系 hibernate 映射

本文主要是介绍hibernate的关系映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作。       

        hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.Java)、映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.xml),它们各自的作用如下。

        映射类*.Java:它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。

        映射文件(*.hbm.xml:它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

        数据库配置文件(*.properties/*.cfg.xml:它是指定与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。当然还可以把映射类的地址映射信息放在这里。

一、Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端。

  比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系。

  

  1、“多”端实体加入引用“一”端实体的变量及getter,setter方法。

  比如说多个学生对应一个班级,在学生实体类加入:private Grade grade;

  2、“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId" ></many-to-one>

  二、Hibernate单向的一对一主键关联映射:就是让两个实体的主键一样,就不需要加入多余的字段了。

  比如一个学生对应一个身份证号,一个学生对应一条户口信息等等,都是一对一关联映射。

  

  1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;

  2、Person端维护关系,所以需要重点看Person的配置文件,Person.hbm.xml通俗来讲 ,就是就是Person中的Id既为主键又为外键。

    所以需要修改Person中的id标签:通俗来讲是告诉Person里的id去关联哪个实体里的id。

    此处的foreign生成策略,会取得关联对象的标识。

    此处的property标签内是关联对象。

    

<id name="id"><generator class="foreign"><param name="property">idCard</param></generator>
</id>

 

    

   

  3、在Person.hbm.xml中添加关联关系的标签:<one-to-one name="idCard" constrained="true"><one-to-one/>

    这里的one-to-one标签指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,根据对端的主键来加载关联对象。

    这里的constrained="true"表示当前主键Person的id主键,还是一个外键,参照了对应端的主键IdCard的id主键,会生成外键约束语句。

    注:采用foreign映射策略在保存person对象的同时也会保存关联的对象,也就是idCard,他们之间还有级联关系。但是反之就不可以,也就是说,如果只保存IdCard对象,是会出错的,不会保存Person对象,因为关系的维护端在Person端,IdCard根本就不知道Person的存在。主键关联映射有弊端,不好维护。

 

  三、Hibernate双向一对一关联映射:有些需求要求从一端可以查到另一端,从另一端又可以查到这一端,就需要双向的关联映射。

  比如说,想要根据人的信息查到他的户口信息,也想根据户口信息查到这是哪个人的信息等。

  

  1、修改对象模型,在IdCard.java 的实体里加入Person的引用,添加属性:private Person person;(在Person.java实体里也有IdCard的引用哦)

  2、修改IdCard.hbm.xml文件,添加one-to-one标签。

  

<one-to-one name="person"/>

  注1:one-to-one标签不影响存储,只影响加载,不会修改数据库,也就是说不会添加字段,而many-to-one会修改数据库,会增加一个字段。

  注2:了解抓取策略:fetch="select" 可以控制查取数据的顺序。

   四、单向一对一唯一外键关联映射:一对一主键关联不好维护,用外键关联对象比较好。原理:多对一的特殊情况。

  比如说还是Person和IdCard的例子。

  1、Person.java是实体里有IdCard的引用,即加入属性:private IdCard idCard;IdCard.java里没有Person引用。

  2、配置文件:IdCard.hbm.xml里都是普通属性。Person.hbm.xml的主键生成策略需要改变:改回:

  

<generator class="native"/>

  使用标签many-to-one和unique  : <many-to-one name="idCard" unique="true"/> ,这样就限制了多的一端的唯一性。

  注:这里需要先保存IdCard.否则报错。

  五、双向一对一唯一外键关联:如果有需求要求的情况下,也可以建立双向的外键关联。

  1、在Person和IdCard里添加对应端的引用,即添加相应属性。

  2、person.hbm.xml和例子(四)中一样,修改IdCard.hbm.xml文件,添加one-to-one标签:<one-to-one name="person" property-ref="idCard"></one-to-one>.

  注:必须指定one-to-one标签中的property-ref属性为关系字段的名称。

  六、Hibernate单向一对多关联映射:让一的一端维护关系,和多对一的映射原理是一样的,都是在多的一端加入一个外键指向一的一端;

    区别在于维护的关系不同:

  • 多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的一端的时候会把一的一端加载上来;
  • 一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的一端的时候会把多的一端加载上来。

  比如说一个班里有多名学生。

  1、Classes.java 和 Student.java里各有两个普通属性id和name。在Classes里加入新属性:private Set students;

  2、映射文件的修改:Classes.hbm.xml里除了普通属性,加入集合映射:

  

<set name="students"><key column="classesid"></key><one-to-many class="com.juyahong.hibernate.Student"/>
</set>

  注1:“一”的一端维护关系。

  注2:session.save(student),session.save(classes),保存student和classes对象。可以成功保存数据,但是需要发出多余的update语句来维持关系。

七、Hibernate双向一对多关联映射:让多的一端来维护关系。

  主要是解决一对多单向关联的缺陷,而不是需求驱动的。

  

  1、在Student.java实体类里添加Classes引用。private Classes classes;

  2、Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那个的基础上加入反转属性inverse(以后将维护关系的工作交给了student)。

  

<set name="students" inverse="true"><key column="classesid"></key><one-to-many class="com.juyahong.hibernate.Student"/>
</set>

 

  注1:先保存classes,再保存student。

  注2:一对多双向关联的映射方式:

  • 在一的一端的集合上采用key标签,可以使得多的一端加入一个外键。
  • 在多的一端采用many-to-one标签

  注3:key标签和many-to-one标签加入的字段保持一致,否则会产生数据混乱。

  注4:一对多关联映射通常在多的一端维护关系,让一的一端失效:

    ------inverse反转属性的使用:可以用在一对多和多对多双向关联上,inverse属性默认为false,即表示在本端可以维护关系,如果inverse为true,即表示本端不维护关系,要交给另一端来维护关系,本端失效。它是控制方向上的反转,只影响存储。

    ------cascade是操作上的连锁反应(暂时了解)。

  八、Hibernate单向多对多关联映射:

  比如学生和课程之间的关系,用户和角色之间的关系都是多对多关系。

  

  

  

  1、User.java和Role.java实体类里都有两个普通属性id和name,在User.java里添加属性,private Set roles;

  2、修改User.hbm.xml映射文件:映射集合:

  

<set name="roles" table="t_user_role"><key column="user_id"/><many-to-many class="com.juyahong.hibernate.Role" column="role_id"/></key>
</set>

 

  

  九、Hibernate双向多对多关联映射:

  1、Role.java里加入新集合private Set users;

  2、在例子八的基础上,修改Role.hbm.xml文件

  

<set name="users" table="t_user_role"><key column="role_id"/><many-to-many class="com.juyahong.hibernate.User" column="user_id"/></key>
</set>



参考文章:http://blog.csdn.net/huangaigang6688/article/details/7761310

http://www.cnblogs.com/jyh317/p/3691842.html





这篇关于hibernate的关系映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132754

相关文章

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这

c++ 和C语言的兼容性关系

C++ 和 C 语言有很高的兼容性,但也存在一些差异和限制。下面是它们的兼容性关系的详细介绍: 兼容性 C++ 是 C 的超集: C++ 语言设计为兼容 C 语言的语法和功能,大部分 C 代码可以在 C++ 编译器中编译运行。 标准库兼容性: C++ 标准库包含了 C 标准库的内容,如 stdio.h、stdlib.h、string.h 等头文件,但 C++ 的标准库也提供了额外的功能,如