`
897371388
  • 浏览: 537385 次
文章分类
社区版块
存档分类
最新评论

ORM框架Hibernate (四) 一对一单向、双向关联映射

 
阅读更多
  1. 简介
    1. 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一、又如一夫一妻制等等。
    2. 记得在Java编程思想上第一句话是“一切皆对象”,生活中的所有事物都是对象,这种一一对应的关系也体现在了对象上,但是在对象上有了些区别这和对象的特性有关系,有了方向性,拿人和身份证来说他们是两个对象,如果是单一方向那么知道了人的信息就能知道身份证信息,相反却得不到。
    1. 从实现角度来分也可以分为两种情况,第一种是共享主键;第二种是唯一外键;这两种都很好理解,我们做的系统也不少了平时我们用的那种就是属于唯一外键约束,共享主键是那其中一个表的主键另一个表来用,两个表使用一个相同的主键来保持两个表中记录一一对应。
  1. 共享主键方式实现
    1. 在维持一对一映射中这种方式用的比较少,可能对于数据库的性能有所提高不需要外键来约束,我们拿人和身份证来说说这种方式怎么实现一对一映射,下面是这两个类的对应关系。
    2. 类图
    1. Person实体类
      1. package com.bjpowernode.hibernate;
        /**
         * a person information
         * @author LLS
         *
         */
        public class Person {
        	//class's properties
        	private int id;
        	private String name;
        	private Card card;
        	//getter and setter method
        	public Card getCard() {
        		return card;
        	}
        	public void setCard(Card card) {
        		this.card = card;
        	}
        	public int getId() {
        		return id;
        	}
        	public void setId(int id) {
        		this.id = id;
        	}
        	public String getName() {
        		return name;
        	}
        	public void setName(String name) {
        		this.name = name;
        	}
        }
        

    1. Card实体类
      1. package com.bjpowernode.hibernate;
        /**
         * a identity card 
         * @author LLS
         *
         */
        public class Card {
        	//class properties
        	private int id;
        	private String cardNo;
        	//getter and setter method
        	public int getId() {
        		return id;
        	}
        	public void setId(int id) {
        		this.id = id;
        	}
        	public String getCardNo() {
        		return cardNo;
        	}
        	public void setCardNo(String cardNo) {
        		this.cardNo = cardNo;
        	}
        	
        }
        

    1. Person映射文件
      1. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Person" table="t_person">
        		<id name="id">
        			<!-- 采用foregin策略,它会取得关联对象的标识 -->
        			<generator class="foreign">
        				<!-- property只关联对象 -->
        				<param name="property">card</param>
        			</generator>
        		</id>  
        		<property name="name"></property>
        		<!-- 
        		one-to-one指示Hibernate如何加载其关联对象,默认根据主键加载,也就是拿到了关联字段
        		根据对端的主键来加载。
        		constrained="true"表示当前主键还是一个外键,也就是会生成外键约束语句,当前主键对引用表来说是一个
        		外键,但对当前表是主键
        		 -->
        		<one-to-one name="card" constrained="true"></one-to-one>
        
        	</class>
        </hibernate-mapping>

    1. Card映射文件
      1. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Card" table="t_card">
        		<id name="id">
        			<generator class="native"></generator>
        		</id>
        		<property name="cardNo"></property>
        	</class> 
        </hibernate-mapping>

    1. 上面是从人到身份证的单向对应关系,如果想实现双向只需在Card类中加入对Person类的引用。另外每个代码中用到的重要属性都做了详细注释,可以参考注释看代码。
  1. 唯一外键约束
    1. 单向关联(从PersonCard
      1. 还拿上面两个实体类举例代码基本同上面相同,上面已经写的很详细,不同的地方只是Person的映射文件有所区别,在里面加入了几个属性。
      2. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Person" table="t_person">
        		<id name="id">
        			<generator class="native">	
        			</generator>
        		</id>  
        		<property name="name"></property>
        		<!-- 
        			这里面代码同上一篇博客,多对一映射代码相同,所不同的是加入了unique属性来限制只能是
        			一对一。
        		 --> 
        		<many-to-one name="card" column="cardId" unique="true"></many-to-one>
        	</class>
        </hibernate-mapping>

      3. 当你看到后是不是觉得和多对一映射关系很像呢,其实,它就是多对一的一种特殊情况也是就是多对一包括了一对一这种情况,我们通过加入了unique属性限制只能为一对一,多对一就成了一对一了。
    1. 双向关联
      1. Card实体以及映射文件中做了一些改动,如下:
      1. Card实体中加入了对Person的引用
      2. package com.bjpowernode.hibernate;
        
        public class Card {
        	private int id;
        	private String cardNo;
        	//加入了对person对象的引用
        	private Person person;
        
        	//…………………………同上
        	//…………………………同上
        }

      3. Card映射文件
      4. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Card" table="t_card">
        		<id name="id">
        			<generator class="native"></generator>
        		</id>
        		<property name="cardNo"></property>
        		<!-- PS -->
        		<!-- property-ref指定对应哪个表的列,如果不设置该属性则默认参照表的主键
        			在person表中的cardId列是参照Card表生成的,反过来,Card表必须也对应cardId列,
        			才能确保一对一关系,但是呢,默认情况会选择参照person表主键,所以,这里加入了property-ref
        			属性来限制一下,参照person表的哪个属性。
        		-->
        		<one-to-one name="person" property-ref="card"></one-to-one>
        	</class> 
        </hibernate-mapping> 

  1. 一对一关联是一种重要的对应关系,尤其是唯一外键约束必须理解和学会运用,在实际开发中这种对应关系可能会更复杂需要根据业务去分析,但原理都是一样的理解了这个对于别的也会轻松上手。
分享到:
评论

相关推荐

    详解Hibernate一对一映射配置

    在Java持久化框架Hibernate中,一对一(One-to-One)映射是对象关系映射的一种常见方式,用于表示两个实体之间一对一的关系。这种关系通常出现在一个实体的实例只能与另一个实体的单个实例相关联的情况。下面我们将...

    hibernate的关联映射

    1. **一对一关联映射** - **主键关联**(Single-Table):在这种情况下,两个实体共享同一个主键。在映射文件中,我们使用`&lt;one-to-one&gt;`标签,并通过`constrained`属性来指定约束。例如,Person和IdCard的单向...

    Hibernate映射解析 七种映射关系

    在Java的持久化框架Hibernate中,ORM(对象关系映射)技术是其核心特性,它允许开发者使用面向对象的方式操作数据库,将数据表与Java对象进行对应。Hibernate通过映射类、映射文件和数据库配置文件来实现这一过程。...

    hibernate一对多关联映射学习小结

    在Hibernate中,一对多关联映射和多对一关联映射的区别在于维护的关系不同。多对一关联映射中,多的一端维护一的一端的关系,在加载多的一端时,可以将一的一端加载上来。一对多关联映射中,一的一端维护多的一端的...

    ORM映射关系配置

    实现Hibernate框架中一对一,一对多,多对多关系的单向和双向配置总结!

    Hibernate映射关系大全

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来处理数据库操作。映射关系是 Hibernate 中的核心概念,它定义了对象模型与数据库表之间的对应关系。以下是对给定文件中提到的各种...

    hibernate各种映射的配置

    本文将详细介绍四种常见的Hibernate映射关系:一对一、唯一外键一对一、简单多对一单向关联以及一对多双向关联。 1. 一对一映射(共享主键) 在一对一的映射关系中,两个实体类(例如`Login`和`Company`)共享同一...

    Hibernate_实体关联关系映射--学习总结

    Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚

    hibernate关系映射

    hibernate关系映射是ORM(对象关系映射)框架Hibernate中的核心概念,它允许我们将数据库表与Java类之间的关系进行抽象,使得在操作对象时能够自动处理底层的SQL语句。关系映射主要涉及的对象包括实体类、表、字段...

    eshop1.0(ssh电子商城)

    8.配置会员到订单的一对多双向关联关系 9.配置会员到留言的一对多单向关联关系 10.配置管理员到留言的一对多单向关联关系 11.配置会员到购物车的一对多单向关联关系 12.配置订单到购物车的一对一单向关联关系 13....

    Hibernate表间关联ppt课件.ppt

    在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,使得开发者可以方便地在Java对象和数据库表之间建立关联。本课件主要讲解了Hibernate中不同类型的表间关联,包括一对一、一对多、多对多的映射方式...

    Hibernate映射文件[文].pdf

    下面我们将详细探讨文档中提到的一对多、多对一、一对一以及多对多四种关系映射。 1. **一对多关系**: - **单向**:在一方的映射文件中,使用 `&lt;set&gt;` 标签定义一个集合属性,`&lt;key&gt;` 标签指明外键列,`...

    Struts + Spring + Hibernate 框架技术

    Hibernate支持多种关联关系的映射,包括单向多对一、单向一对多和双向一对多等。配置这些关联关系时,要考虑程序效率和业务需求。 此外,Hibernate提供了两种主要的查询方式: 1. HQL(Hibernate Query Language)...

    HIbernate关联关系总结

    在Java的ORM(对象关系映射)框架Hibernate中,关联关系是将数据库中的表与Java对象之间建立联系的重要机制。本篇文章将详细讲解Hibernate的两种单向关联关系:单向1-N关联和单向N-1关联。 1. **单向1-N关联** 在...

    hibernate源码分析过程

    Hibernate 是一个基于 Java 的 ORM(Object-Relation Mapping)框架,允许开发者使用面向对象的方式与关系数据库交互。在本文中,我们将对 Hibernate 的源码进行深入分析,并探讨其核心特性和技术实现。 架构 ...

    ssh框架.doc

    Hibernate是一个优秀的对象关系映射(ORM)框架,它提供了一种在Java应用程序中操作数据库的简便方式。通过Hibernate,开发者可以用面向对象的方式来处理数据库操作,而无需直接编写大量的SQL语句。它对JDBC进行了...

    Hibernate4.3.4.Final-中文文档

    关联映射章节则深入分析了一对一、一对多、多对一、多对多等各种关联类型及其双向映射。 组件映射和继承映射部分,讲解了如何将对象分解为依赖对象、依赖对象的集合,以及如何利用组件实现更复杂的映射策略,如使用...

    Spring+Struts+hibernate框架知识

    Hibernate是一个ORM(对象关系映射)框架,它的主要任务是将Java对象映射到数据库表,简化数据库操作。Hibernate的工作流程包括解析配置文件和映射信息,创建SessionFactory,通过Session执行数据库操作。其优点在于...

    hibernate一对多多对一源码例子

    在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作。本示例探讨的是Hibernate中的一对多多对一关系,这是数据库设计中常见的关联类型。我们将通过源码分析来理解如何在Hibernate...

    Hibernate工作原理及为什么要用

    3. **避免不必要的一对一关联**:多对一通常更为高效。 4. **对象缓存策略**:避免使用集合缓存,提高性能。 5. **集合类型选择**:Bag用于一对多,Set用于多对多,以确保无重复。 6. **显式多态**:在继承类中使用...

Global site tag (gtag.js) - Google Analytics