009一对一  主键关联映射_单向(one-to-one)

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

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

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

实例场景:人—-> 身份证号(PersonàIdCard),从IdCard看不到Person对象

对象模型(主键关联映射-单向):

(站在人的角度看)

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;

    }

}

Person实体类:

public class Person {

    private int id;

    private String name;   

    private IdCard 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;

    }

    public IdCard getIdCard() {

        return idCard;

    }

    public void setIdCard(IdCard idCard) {

        this.idCard = idCard;

    }

}

因为是person引用idcard,所以idcard要求先有值。而person的主键值不是自己生成的。而是参考idcard的值,person即是主键,同时也是外键。

IdCard实体类的映射文件:

<hibernate-mapping>

    <class name="com.wjt276.hibernate.IdCard" table="t_idcard">

        <id name="id" column="id">

            <generator class="native"/>

        </id>

        <property name="cardNo"/>

    </class>

</hibernate-mapping>

Persion实体类的映射文件:

<hibernate-mapping>

    <class name="com.wjt276.hibernate.Person" table="t_person">

        <id name="id" column="id">

            <!--

                因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略

                foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。

                再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。

             -->

            <generator class="foreign">

                <!-- 元素<param>属性name的值是固定为property -->

                <param name="property">idCard</param>

            </generator>

        </id>

        <property name="name"/>

        <!-- <one-to-one>标签

        表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。

        默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)

 我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true"

         -->

        <one-to-one name="idCard" constrained="true"/> 

</class>

</hibernate-mapping>

导出至数据库表生成代码如下:

create table t_idcard (id integer not null auto_increment, cardNo varchar(255), primary key (id))

create table t_person (id integer not null, name varchar(255), primary key (id))

alter table t_person add index FK785BED805248EF3 (id), add constraint FK785BED805248EF3 foreign key (id) references t_idcard (id)

* alter table  ……  意思:person的主键id以外键参照idcard的主键

※<one-to-one>标签※

现在是使用一对一主键关联映射,因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略(使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用)。再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。

<id name="id" column="id">

        <generator class="foreign">

            <param name="property">idCard</param>

        </generator>

    </id>

<one-to-one name="idCard" constrained="true"/> 

一对一 主键关联映射 存储测试

session = HibernateUtils.getSession();

            tx = session.beginTransaction();

            IdCard idCard = new IdCard();

            idCard.setCardNo("88888888888888888888888");

            Person person = new Person();

            person.setName("菜10");

            person.setIdCard(idCard);

            //不会出现TransientObjectException异常

            //因为一对一主键关键映射中,默认了cascade属性。

            session.save(person);

            tx.commit();

注:不会出现TransientObjectException异常,因为一对一主键关键映射中,默认了cascade属性。

 

生成SQL语句:

Hibernate: insert into t_idcard (cardNo) values (?)

Hibernate: insert into t_person (name, id) values (?, ?)

一对一 主键关联映射 加载测试

session = HibernateUtils.getSession();

            tx = session.beginTransaction();

            Person person = (Person)session.load(Person.class, 1);

            System.out.println("person.name=" + person.getName());

            System.out.println("idCard.cardNo=" + person.getIdCard().getCardNo());

            // 提交事务

            tx.commit();

生成SQL语句:

Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from t_person person0_ where person0_.id=?

person.name=菜10

Hibernate: select idcard0_.id as id1_0_, idcard0_.cardNo as cardNo1_0_ from t_idcard idcard0_ where idcard0_.id=?

idCard.cardNo=88888888888888888888888

一对一 主键关联映射 总结:

让两个实体对象的ID保持相同,这样可以避免多余的字段被创建

<id name="id" column="id">

     <!—person的主键来源idcard,也就是共享idCard的主键-->

            <generator class="foreign">

                <param name="property">idCard</param>

            </generator>

        </id>

        <property name="name"/>

<!—one-to-one标签的含义:指示hibernate怎么加载它的关联对象,默认根据主键加载

constrained="true",表面当前主键上存在一个约束:person的主键作为外键参照了idCard-->

        <one-to-one name="idCard" constrained="true"/>

009一对一 主键关联映射_单向(one-to-one)的更多相关文章

  1. 010一对一 主键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  2. 011一对一 唯一外键关联映射_单向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  3. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  4. Hibernate关联映射1:一对一主键关联

    2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...

  5. Hibernate5.2之一对一主键关联(四)

                                                      Hibernate5.2之一对一主键关联(四) 一.简介 一对一关联关系分为两种:a.主键关联:b. ...

  6. 012一对一 唯一外键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  7. Hibernate注解:一对一主键关联

    情形:两个表,my_site和my_site_company,通过主键site_id唯一关联.my_site的主键是自动增加,my_site_company的主键依赖于my_site. # # Sou ...

  8. java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

      hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...

  9. hibernate一对一主键双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. win8如何显示文件后缀名

    按快捷键[WIN+X]然后点击[文件资源管理器]   进入我的电脑后点击菜单栏的[查看]   查看下面有一个[文件扩展名]把前面那个勾,勾上就可以显示后缀名了.   同样的道理取消勾就是隐藏后缀名. ...

  2. Nginx配置同一个域名同时支持http与https两种方式访问

    Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server{listen 80;listen 443 ssl;ssl on;server_name 域名;in ...

  3. LINUX ON AZURE 安全建议(全)

    本文为个人原创,可以自由转载,转载请注明出处,多谢! 本文地址:http://www.cnblogs.com/taosha/p/6399554.html 1.网络与安全规划 Azure 虚拟网络 (V ...

  4. 《深入理解Java函数式编程》系列文章

    Introduction 本系列文将帮助你理解Java函数式编程的用法.原理. 本文受启发于JavaOne 2016关于Lambda表达式的相关主题演讲Lambdas and Functional P ...

  5. 分享一本书<<谁都不敢欺负你>>

    有些人,不管在工作还是生活上,总是被人欺负. 分享这本书给大家,能给大家带来正能量.你强大了,就没人敢欺负你. 有的时候,感到为什么倒霉的总是我?为什么我的命运是这样?为什么总欺负我? 也许有很多人会 ...

  6. [Android]Gradle 插件 DiscardFilePlugin(class注入&清空类和方法)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6732128.html Android Gradle 插件 Di ...

  7. 使用live555 在linux下搭建 rtsp server

    系统环境 Debian 7 x64  / centos 7 x64  都可以 首先去下载源码 http://www.live555.com/liveMedia/public/live555-lates ...

  8. 【转载】32复用时钟AFIO开启情况

    原文:http://blog.csdn.net/u012411027/article/details/44217313 百度了很多结果,打开看几乎全是下面这篇文章,真是天下文章一大抄啊.我也抄一下吧. ...

  9. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

    本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...

  10. [Git]09 如何为命令起外号

    Git并不会推断你输入的几个字符将会是哪条命令,不过如果想偷懒,少敲几个命令的字符,可以用 git config 为命令设置别名.来看看下面的例子: $ git config --global ali ...