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

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教程04_关系映射之一对一单向外键关联

    **标题详解:**“Hibernate教程04_关系映射之一对一单向外键关联” 在Hibernate框架中,关系映射是数据库表之间的关联在对象模型中的体现。本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库...

    Hibernate教程06_关系映射之一对一单向主键关联

    4. **配置一对一关系映射:** 在Hibernate中,可以使用`@OneToOne`注解来声明一对一关联,并通过`@PrimaryKeyJoinColumn`注解指定主键关联的列。在拥有端实体中,可以直接使用这个注解,而在无拥端则不需要任何额外...

    详解Hibernate一对一映射配置

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

    hibernate一对一关联关系

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据访问。在实体类之间,Hibernate支持多种关联关系,包括一对一(One-to-One)、一...

    Hibernate教程10_关系映射之多对一单向关联

    本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...

    hibernate的关联映射

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

    Hibernate教程11_关系映射之一对多单向关联

    本教程主要探讨的是Hibernate中的一种重要关系映射类型:一对多单向关联。在关系型数据库中,一对多关联是最常见的关系类型,一个实体可以与多个其他实体相关联。在Hibernate中,这种关系可以通过配置XML映射文件或...

    Hibernate映射解析 七种映射关系

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

    Hibernate单向关联代码示例

    在Java的持久化框架Hibernate中,关联映射是数据库对象之间关系的一种体现,它使得ORM(对象关系映射)更加灵活。"Hibernate单向关联代码示例"是一个实用的学习资源,帮助开发者理解如何在实际项目中实现单向关联。...

    Hibernate双向关联代码示例

    在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本示例将深入探讨Hibernate中的双向关联,这是一种常见且重要的数据模型映射技术。 双向关联是指两个实体类之间存在相互...

    Hibernate教程13_关系映射之多对多单向关联

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是多对多单向关联。在数据库设计中,多对多关系是两个实体之间最复杂的关系类型,允许一个实体实例与多个其他实体实例相关联,反之亦然。在...

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

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

    hibernate一对一的关系

    在Java持久化框架Hibernate中,一对一(One-to-One)关系是一种常见的对象关系映射(ORM)配置,它用于表示两个实体之间的一种特殊关联,其中每个实体最多只能与另一个实体的一个实例相关联。这种关系在数据库层面...

    ORM映射关系配置

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

    Hibernate映射关系大全

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

    hibernate各种映射的配置

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

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

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

    Hibernate 一对一,一对多,多对多例子

    Hibernate是一个Java持久化框架,它提供了对象关系映射(ORM)功能,使得开发人员可以方便地在Java对象和关系数据库之间进行数据操作。 **描述解析:** 描述中提到“讲得非常清楚”,意味着这些示例提供了清晰的...

    hibernate关系映射

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

    hibernate实例(一对多,多对一)

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作抽象化,通过对象模型来处理数据库交互。在这个“hibernate实例(一对多,多对一)”的主题中,我们将深入探讨两种重要的关联关系:一对...

Global site tag (gtag.js) - Google Analytics