浅析Hibernate映射(二)——关系映射(4)

单向一对多关联映射

映射后的关系模型:

映射文件:

一对多关联映射和多对一关联映射映射原理是一致的,都是在多的一端加入一个外键,指向一的一端

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

* 多对一维护的关系是:多指向一的关系,有了此关系,在加载多的时候可以将一加载上来

* 一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来

Group.hbm.xml

[html] view plaincopyprint?

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.jialin.hibernate">
  6. <class name="Group" table="t_group">
  7. <id name="id">
  8. <generator class="native" />
  9. </id>
  10. <property name="name" />
  11. <set name="users">
  12. <key column="groupid"/>
  13. <one-to-many class="User"/>
  14. </set>
  15. </class>
  16. </hibernate-mapping>

User.hbm.xml

[html] view plaincopyprint?

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.jialin.hibernate">
  6. <class name="User" table="t_user">
  7. <id name="id">
  8. <generator class="native" />
  9. </id>
  10. <property name="name" />
  11. </class>
  12. </hibernate-mapping>

在一的一端维护关系存在缺陷:

* 因为多的一端User不知道Group的存在(也就是User没有维护与Group的关系)
 所以在保存User的时候关系字段groupid是为null的,如果将该关系字段设置为非空,则
 将无法保存数据

* 另外因为User不维护关系,而Group维护关系,Group就会发出多余的update语句,保证
 Group和User有关系,这样加载Group的时候才可以把该Group对应的User加载上来

为了克服这些缺陷,我们一般将单向一对多关联映射改为双向的。如下:

映射后的关系模型与单向的一样:

采用一对多双向关联映射的目的主要是为了主要是为了解决一对多单向关联的缺陷,而不是需求驱动的。

映射文件:

一对多双向关联的映射方式:
 * 在一的一端的集合上采用<key>标签,在多的一端加入一个外键
 * 在多的一端采用<many-to-one>标签
 * <key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱

Group.hbm.xml

[html] view plaincopyprint?

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.jialin.hibernate">
  6. <class name="Group" table="t_group">
  7. <id name="id">
  8. <generator class="native" />
  9. </id>
  10. <property name="name" />
  11. <set name="users" inverse="true">
  12. <key column="groupid"/>
  13. <one-to-many class="User" />
  14. </set>
  15. </class>
  16. </hibernate-mapping>

User.hbm.xml

[html] view plaincopyprint?

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.jialin.hibernate">
  6. <class name="User" table="t_user">
  7. <id name="id">
  8. <generator class="native" />
  9. </id>
  10. <property name="name" />
  11. <many-to-one name="group" column="groupid"/>
  12. </class>
  13. </hibernate-mapping>

inverse属性:

* inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为 false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端 维护关系,本端失效。
 一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置inverse为true

*inverse是控制方向上的反转,只影响存储

时间: 2024-10-29 03:14:16

浅析Hibernate映射(二)——关系映射(4)的相关文章

菜鸟学习Hibernate——一对多关系映射

Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创建实体类Classes和实体类Student Classes.java package com.bjpowernode.hibernate; import java.util.Set; public class Classes { private int id; private String nam

Hibernate多对多关系映射

两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系.比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以授予多个用户. 在持久化对象设计的时候,角色和用户都分别有一个集合来防止拥有它的用户或角色.角色类的设计: public class RolePO { private int id;  private String name;  private Set employees = new HashSet

Hibernate多对多关系映射(建表)

下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了Hibernate多对多关系映射,则中间关系表不会生成实体(即没有对应的pojo类,更没有其映射文件). 1.建立表 DROP TABLE user_course ; DROP TABLE user ; DROP TABLE course ; CREATE TABLE user ( userid  

hibernate的对象/关系映射结果为空,exists查不到值的问题-20190823

1: hibernate的对象/关系映射 情景:在使用@onetotone/@manytonone时关联结果为空 原因:在使用这个注解的时候,默认的时crossjoin(交叉连接),在进行查询时以及排序时用到了注解关联的属性,如果这个属性为空就会导致查空 解决:注意关联过程中使用到的属性一定要存在 拓展: 1 @OneToOne(fetch = FetchType.LAZY)--懒加载2 @JoinColumns({ 3 @JoinColumn(name = "主键", referen

hibernate 多对多关系映射

学生 和 课程就是一种多对多的关系映射,那么再hibernate中,对于多对多关系在怎么配置? 和一些注意的事项?简单测试下. 建表 实体 配置文件和映射 测试 1.使用oracle ,建表sql create table students( id number(7) primary key,   name nvarchar2(20),   age number(2) ) create table course( id number(7) primary key,   name nvarchar

SSH-Hibernate(二)—关系映射(上)

关系映射的理解 上篇博客说过ORM是一种持久化的解决方案,它的思想呢就是将关系数据库中的表的记录映射到JAVA对象中.直白的说就是JAVA对象和关系数据库中的记录建立起了固定的对应关系,对象即记录!这样做的带来的最直接的表现就是,开发人员可以以面向对象的思想来操作关系型的数据库. 对象对应的是数据表中的记录,而在关系数据库中记录和记录之间存在着一对一.一对多.多对多等关系.ORM映射也需要保存这些记录之间的关系,它主要通过面向对象中关联关系来实现,继承关系是比较特殊的一种反应记录之间关系的形式.

Hibernate之实体关系映射

延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才会执行SQL语句加载Email 注解配置时,@OnetToMany(Fetch = FetchType.EAGER)为即时加载,Fetch = FetchType.LAZY为延迟加载 延迟加载和即时加载的策略适用于所有一对多.多对一.多对多等所有的实体关系 一般来说,延迟加载要比即时加载节省资源,但

Hibernate初探之单表映射——创建对象-关系映射文件

编写一个Hibernate例子 第三步:创建对象-关系映射文件 以下是具体实现步骤: 找到我们要持久化的学生类Sudents 生成对象-关系映射文档Students.hbm.xml: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourcefor

hibernate 一对多 关系映射

在关系中,或多或少的表之间有复杂的关联关系 这里测试 一对多 关联关系的配置 开发步骤就不多说了.直接看一个示例. users 用户 和  shop商品订单表 分析:一个用户可以有多个商品订单,一个订单只属于一个用户. 这样就构成了一对多的关联关系. 这里用的是oracle 数据库 users 和 shop 数据库表 create table users( id number(7) primary key,   name nvarchar2(20),   pass nvarchar2(20),

Hibernate映射(二)——多对一关系映射

上篇学习了Hibernate的基本映射,也就是单表映射,很容易就能理解,但是对于关系数据库来说,表之间存在关系是比不可少的,关系数据库中存在的关系是通过主外键建立起来的,反应到Hibernate要如何通过对象表现呢?下面我们就继续学习Hibernate的对象关系映射. 我们先从最常见的多对一和一对多关系开始: 多对一 所谓多对一,在数据库中即在多的一端添加外键关联到一的一端,比如用户(User)和用户所在组(Group)的关系:一个User只属于一个Group,一个Group有多个Group,并