【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库。

【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境。并做了一个简单实例,对它的基本原理有了一个理性的认识。

【SSH进阶之路】Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念。并给大家实现相关实例。比較简单。

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)。我们介绍了多对一的关联映射,并具体了讲解了,映射技巧。这篇我们依然使用此映射技巧,帮助大家更好的理解。

以下開始今天的愉快之旅。

映射原理

两个实体对象之间是一对一的关联映射,即一个对象仅仅能与另外唯一的一个对象相相应。

比如:一个人(Person)仅仅有一张身份证(IdCard)。我们看一下这个样例的对象模型,例如以下图所看到的:

对象模型

从上图中能够看出:

1、一个人仅仅有一张身份证,唯一的一个身份证号。对象之间是一对一的关系。

2、人(Person)持有身份证(IdCard)的引用,所以,两个对象关系维护由person端决定。

从对象模型映射成关系模型,有两种方式:主键关联和唯一外键关联,我们继续看以下的内容。

分类:

主键关联:

1、两个实体对象的主键一样,以表明它们之间的一一相应关系。

2、不须要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。

以上两点恰与唯一外键关联相反。

 主键关联的关系模型

Person.hbm.xml

<?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 package="com.liang.hibernate">
<class name="Person" table="t_person">
<id name="id">
<!-- 採用foreign生成策略。forgeign会取得另外一个关联对象的标识 -->
<generator class="foreign" >
<param name="property">idCard</param>
</generator>
</id>
<property name="name"></property>
<!--
one-to-one指示hibernate怎样载入其关联对象,默认依据主键载入
也就是拿到关系字段值,依据对端的主键来载入关联对象 constrained="true"表示约束,当前主键(person的主键)还是一个外键
參照了对端的主键(IdCard的主键),也就是会生成外键约束语句
-->
<!-- idCard属性。表达的是本对象与IdCard的一对一关系。 -->
<one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one>
</class>
</hibernate-mapping>

生成的表结构以及測试数据:

唯一外键关联:

1、两个实体对象用一个外键来关联。以表表明对象之间的关系。

2、事实上它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系。

所以它採用多对一的标签来映射。例如以下所看到的:

<!-- 採用<mang-to-one>标签来映射,指定多的一端unique为true,
这样就限制了多的一端的多重性为一,就是这样来映射的。 -->
<many-to-one name="" unique="true"></many-to-one>

唯一外键的关系模型

Person.hbm.xml

<?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 package="com.liang.hibernate">
<class name="Person" table="t_person">
<id name="id">
<generator class="native" ></generator>
</id>
<property name="name"></property>
<!-- 因为它是一对一的唯一外键关联,它是多对一关联的特例,凝视能够直接写成多对一关联-->
<!-- idCard属性,表达的是本对象与IdCard的多对一关系。 -->
<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>
</class>
</hibernate-mapping>

生成的表结构以及測试数据:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaml1cWl5dWxpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:413px; height:259px">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaml1cWl5dWxpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:474px; height:131px">

其它同样代码例如以下:

Person

public class Person {
private int id;
private String name;
private IdCard idCard; public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
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;
}
}

IdCard

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(String cardNo) {
this.cardNo = cardNo;
}
}

IdCard.hbm.xml

<?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 package="com.liang.hibernate">
<class name="IdCard" table="t_idCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo"></property>
</class>
</hibernate-mapping>

建议

因为一对一主键关联映射具有下面两个缺点:

1、灵活性差。没有办法改成多对一关联映射,不能应变多变的需求;

2、必须先保存关联对象IdCard,之后才干保持Person。

所以,在映射一对一单向关联映射时,我们採用唯一外键关联映射。

下篇博文。我们介绍一对一双向关联映射,谢谢关注。

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)的更多相关文章

  1. (Hibernate进阶)Hibernate映射——一对一单向关联映射(五)

    映射原理 两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.例如:一个人(Person)只有一张身份证(IdCard).我们看一下这个例子的对象模型,如下图所示: 对象模型 ...

  2. 【SSH系列】Hibernate映射 -- 一对一单向关联映射

     映射原理       一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.有两种策略可以实现一对一的关联映射:       a.主键关联:即让两个对象具有相 ...

  3. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

  4. 【SSH系列】hibernate映射 -- 一对一双向关联映射

    开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...

  5. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  6. java之hibernate之基于外键的一对一单向关联映射

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

  7. Java进阶知识11 Hibernate多对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联 1.2.创建Teacher类和Student ...

  8. Java进阶知识09 Hibernate一对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在一的一方加Set 1.2.创建Customer类和Order类 package com.shore.model; import java.util.Hash ...

  9. Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...

随机推荐

  1. solr6.6安装

    1. 确保系统已经安装jdk1.8,以及Tomcat8. 注:使用Tomcat7会出现很多问题,我遇到的是直接打不开solr的index页面,看网上有网友说还会遇到各种css.js资源404..还有l ...

  2. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  3. [深度应用]·Keras实现Self-Attention文本分类(机器如何读懂人心)

    [深度应用]·Keras实现Self-Attention文本分类(机器如何读懂人心) 配合阅读: [深度概念]·Attention机制概念学习笔记 [TensorFlow深度学习深入]实战三·分别使用 ...

  4. Apollo 分布式配置中心

    1.  介绍 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置 ...

  5. Android下设置ListView数据加载完成后执行layoutanimation

    今天使用android的volley框架写了一个简单的网络天气获取的demo. 承载数据的空间是ListView 因为是网络加载,必然先要设置ListView的默认数据,我设置的就是那个Loading ...

  6. SQLite to Asp.net Entity Framework 部署问题

    最近做了一个小应用,使用SQLite做数据库.开始用DBLINQ的时候,做一个LINQ查询出现不支持的问题.后来看到Entity Framework是可以支持SQLite的,于是很快转换过来.完成开发 ...

  7. stretchableImageWithLeftCapWidth气泡拉伸

    - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCap ...

  8. Python代码优化概要

    Python即是面向过程语言,也是面向对象语言,很多其它情况下充当脚本语言的角色.虽是脚本语言,但相同涉及到代码优化的问题,代码优化可以让程序执行更快,它是在不改变程序执行结果的情况下使程序执行效率更 ...

  9. Linux下快速安装Mysql及使用

    1.安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 查看有没有安装包: yum list mysql* 安装mysql客户端: ...

  10. sqlite constraint

    sqlite3中的约束例如以下: CREATE TABLE CheckTable (rowId integer primary key autoincrement, name text not nul ...