`
什么世道
  • 浏览: 221543 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Hibernate 关系映射之一对一关联

阅读更多

Hibernate 关系映射之一对一关联

Hibernate 最核心的功能是解决O/RMapping和事务处理。所以在此不得不论及Hibernate 关系映射

 

当然,这里说的映射其实是对象之间的关系并不是指数据库的关系,因为Hibernate是对象化操作。

 

因为做项目的时候频繁使用了关系映射,在此过程中学习了尚学堂马士兵老师的Hibernate教程,结合自己的体会,和各位道友分享一下。

主要关系:

  • 一对一
  • 多对一
  • 一对多
  • 多对多

以上假如要细分的话下以层级还有单向关联、多向关联。

主要是这6种(一对多和多对一本质上没差),

当然还有集合映射,继承映射。不过暂时还用的少。

 

 

一、一对一单向关联映射

前提:两个对象之间是一对一的关系,如Person-IdCard(人—身份证号)

 那么有两种策略可以实现一对一的关联映射

  •  主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。
  •  唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。

对象模型

实体类:

/** 人-实体类 */

 

public class Person {
    private int id;
    private String name;
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
}
 

 

 

/**身份证-实体类*/

 

public class IdCard {
    private int id;
    private String cardNo;
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public String getCardNo(){ return cardNo;}
    public void setCardNo(StringcardNo) {this.cardNo = cardNo;}
}
 

 

(一)唯一外键关联(单向) 

1、对象模型


 

 

2、关系模型 


 
 

3.1、实体映射关联(xml方式)

使用<many-to-one>标签关联,并使用unique="true"唯一性约束。

 

<hibernate-mapping>
  <class name="com.yk.hibernate.IdCard" table="id_card">
      <id name="id" column="id">
          <generator class="native"/>
      </id>
      <property name="cardNo" column="card_no"/>
  </class>
</hibernate-mapping>

  

<hibernate-mapping>
  <class name="com.yk.hibernate.Person" table="person">
      <id name="id" column="id">
          <generator class="native"/>
      </id>
      <property name="name"/> 
      <!-- <many-to-one>:在多的一端 ,加入一个外键指向一的一端 ,但多对一关联映射字段可重复,所以需要加入一个唯一条件约束unique="true"-->
      <many-to-one name="idCard"  column="card_id" unique="true"/>
  </class>
</hibernate-mapping>

 


3.2、实体映射关联(annotation方式) 

使用@OneToOne进行注解,来体现是一对一的关系

    IdCard类 

@Entity
public class IdCard {
    private int id;
    private String cardNo;
    @Id
    @GeneratedValue
    public int getId() {return id;}
    public void setId(int id) {this.id = id;} 
    public String getCardNo(){ return cardNo;}
    public void setCardNo(StringcardNo) {this.cardNo = cardNo;}
}

 

    Person类  

@Entity
public class Person {
    private int id;
    private String name;
    private IdCard idCard; //添加对象
    @Id
    @GeneratedValue
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
    @OneToOne //表示一对一的关系
    @JoinColumn(name="card_id") //为外键指定名称
    public IdCard getIdCard() { return idCard; } 
    public void setIdCard(IdCard idCard) { this.idCard = idCard; }

}

 

 

(二) 主键关联(单向) 

1、对象模型 


 

2、关系模型


 

3.1、主键单向关联(xml方式)

IdCard映射文件,先生成ID 

 

  <class name="com.yk.hibernate.IdCard" table="id_card">
        <id name="id"column="id">
            <generator class="native"/>
        </id>
        <property name="cardNo" column="card_no"/>
    </class>
 

 

Person实体类映射文件,ID是根据IdCard主键值,主键生成策略不能使用native或者identity了,而是  foreign  

 

<class name="com.yk.hibernate.Person"table="person">
        <id name="id"column="id">
            <generator class="foreign"> 
                <param name="property">idCard</param>
            </generator>
        </id>
        <property name="name"/> 
        <one-to-one name="idCard"constrained="true"/> 
</class>

 

 

 

 3.2、主键单向关联(annotation方式)

使用@OneToOne注解一对一关系,再使用@PrimaryKeyJoinColumn来注解主键关系映射。

Person类 

 

@Entity
public class Person {
    private int id;
    private String name;
    private IdCard idCard; //添加对象
    @Id 
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
    @OneToOne //表示一对一的关系  

       @PrimaryKeyJoinColumn//注解主键关联映射 

    public IdCard getIdCard() { return idCard; } 
    public void setIdCard(IdCard idCard) { this.idCard = idCard; }

}

 

 

二、一对一双向关联映射

上面的示例可以通过身份证idCard来找到相应的人Person,而反过来却不能查询。所以就有了一对一双向关联。

例如:夫妻关系就是一对一双向关联关系,通过丈夫可以找到妻子,通过妻子也可以找到丈夫。

 

(一)唯一外键关联(双向) 

annotation方式:只需要在未加关联的注解mappedBy就ok了 

 

@Entity
public class Husband {
	private int id;
	private String name;
	private Wife wife;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	
	public String getName() {
		return name;
	}
	@OneToOne
	@JoinColumn(name="wifeId")
	public Wife getWife() {
		return wife;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setWife(Wife wife) {
		this.wife = wife;
	}
	
}

 

 @Entity
public class Wife {
	private int id;
	private String name;
	private Husband husband;
	@OneToOne(mappedBy="wife")
	public Husband getHusband() {
		return husband;
	}
	public void setHusband(Husband husband) {
		this.husband = husband;
	}
	@Id
	@GeneratedValue
	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;
	}
	
}

 

 

 2、xml方式:使用<one-to-one>标签,并设置对应的关联类 

 

<class name="com.yk.hibernate.Wife" table="wife">
        <id name="id" column="id">
            <generator class="native"/></id>
        <property name="name"/> 
        <one-to-one name="husband" property-ref="Wife"/>
 </class>

 

 

 

  • 大小: 5.6 KB
  • 大小: 6.6 KB
  • 大小: 7.2 KB
  • 大小: 9.3 KB
1
0
分享到:
评论

相关推荐

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    Hibernate教程05_关系映射之一对一双向外键关联

    在Hibernate中,一对一关联的配置主要通过注解或XML配置文件完成。对于双向关联,我们需要在两个实体类中分别设置相应的属性和关联注解。 在实体类A中,我们将添加一个类型为B的属性,并使用`@OneToOne`注解来指定...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate 关联关系映射分类

    一对一关联是数据库设计中最常见的关联类型之一,它指的是两个实体之间存在一种一对一的关系。在Hibernate中,一对一关联可以被进一步细分为单向关联和双向关联,以及基于主键关联和基于外键关联。 #### 单向关联 ...

    Hibernate一对一主键关联映射(双向关联)

    一对一关联分为两种:基于主键的关联(Primary Key Association)和基于外键的关联(Foreign Key Association)。在基于主键的关联中,两个实体共享相同的主键,而在基于外键的关联中,一方实体的主键作为另一方实体...

    Hibernate集合映射与关联关系

    本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合关系"、"student与class的多对一"以及"一对多映射"的概念。 首先,让我们理解一下Hibernate中的集合映射。在关系型数据库中,一个实体...

    Hibernate教程04_关系映射之一对一单向外键关联

    在保存或更新实体时,Hibernate会自动处理一对一关联的外键维护。 6. **懒加载与立即加载**:在一对一关系中,可以设置fetch属性来控制关联对象的加载策略,如懒加载(延迟加载)和立即加载。 7. **级联操作**:...

    Hibernate关联映射

    一对一关联适用于实体间一对一的关系,一对多适用于一个实体可以拥有多个子实体的情况,而多对多则适用于两个实体之间存在多对多的关系。理解这些关联类型及其配置对于设计高效、灵活的 ORM 解决方案至关重要。

    hibernate关联映射的作用和常用属性解释

    其中,“关联映射”是Hibernate中的一个重要概念,用于处理实体之间的关联关系,例如一对一、一对多、多对一以及多对多等。 #### 常用属性解析 为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解...

    hibernate多对多关联映射

    总之,Hibernate的多对多关联映射是解决复杂关系数据库设计的关键技术之一。通过合理的配置和使用,开发者可以轻松管理实体之间的多对多关系,提高开发效率。理解并熟练掌握这部分知识对于提升Java企业级应用开发...

    hibernate的关联关系映射

    【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...

    Hibernate一对一主键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理两个实体之间存在唯一对应关系时非常有用。本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个...

    Hibernate教程07_关系映射之一对一双向主键关联

    在" Hibernate教程07_关系映射之一对一双向主键关联"中,我们将学习如何设置这种关联。首先,我们需要创建两个实体类,例如`Employee`和`Department`。在每个类中,我们都需要定义主键字段,并用`@Id`注解标记。然后...

    hibernate一对一关联关系

    本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    hibernate关联关系映射

    "hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何在Java对象和数据库表之间建立关系。以下是对这个主题的详细讲解: 一、一对一关系映射(One-to-One) 一对一关系是指一个实体对应另一个实体的...

Global site tag (gtag.js) - Google Analytics