(十)Hibernate的一对一关联关系

一、概述

我们以Company与Address类为例,介绍映射一对一关联关系的方法。 
一对一的关联方法有两种 
-按照外键映射:两个表任意一个表定义一个外键,来关联另一个表。 
-按照主键映射:一个表的主键同时作为外键,和另一个表的主键保持一致。

二、按照外键映射

(1)创建实体类

            public class Company {
                private Integer id;
                private String name;
                private Address address;
                public Integer getId() {
                    return id;
                }
                public void setId(Integer id) {
                    this.id = id;
                }
                public String getName() {
                    return name;
                }
                public void setName(String name) {
                    this.name = name;
                }
                public Address getAddress() {
                    return address;
                }
                public void setAddress(Address address) {
                    this.address = address;
                }

            } 

            public class Address {
                private Integer id;
                private String name;
                private Company company;
                public Integer getId() {
                    return id;
                }
                public void setId(Integer id) {
                    this.id = id;
                }
                public String getName() {
                    return name;
                }
                public void setName(String name) {
                    this.name = name;
                }
                public Company getCompany() {
                    return company;
                }
                public void setCompany(Company company) {
                    this.company = company;
                }

            }

  (2)我们配置映射文件,我们在Company这一方设置外键来关联Address 有外键的一方要使用<many-to-one>元素来配置。

        Company.hbm.xml
         <hibernate-mapping >
            <class name="com.cad.domain.Company" table="company">
                <id name="id" column="id">
                    <generator class="native"></generator>
                </id>
                <property name="name" column="name"></property>
                <!--column指定外键,unique指定外键唯一约束,设为true,就可以表达Company和Address对象之间的一对一关联-->
                <many-to-one name="address" class="com.cad.domain.Address" column="aid" unique="true"></many-to-one>
            </class>
         </hibernate-mapping>   

         Address.hbm.xml
         <hibernate-mapping >
            <class name="com.cad.domain.Address" table="address">
                <id name="id" column="id">
                    <generator class="native"></generator>
                </id>
                <property name="name" column="name"></property>
                <!--property-ref属性指定通过从Company的address属性来查找自己-->
                <one-to-one name="Company" class="com.cad.domain.Company" property-ref="address"></one-to-one>
            </class>
         </hibernate-mapping>

  测试:

                 public class Demo {

                    private Session session;

                    @Test
                    public void test() {
                        //读取配置文件
                        Configuration conf=new Configuration().configure();

                        //根据配置创建factory
                        SessionFactory sessionfactory=conf.buildSessionFactory();
                        session = sessionfactory.openSession();
                         Transaction ts=session.beginTransaction();
                        Company c=new Company();
                        c.setName("百度");
                        Address a=new Address();
                        a.setName("深圳");
                        c.setAddress(a);
                        a.setCompany(c);

                        session.save(a);
                        session.save(c); 

                        ts.commit();
                        session.close();
                        sessionfactory.close();
                    }

                }

            默认情况下,一对一关联采用迫切左外连接检索策略。

  

三、按照主键映射

    实体类不变,我们编写一下配置文件
    address的表的id字段既是主键又是外键.

        编写配置文件
        Company.hbm.xml
         <hibernate-mapping >
            <class name="com.cad.domain.Company" table="company">
                <id name="id" column="id">
                    <generator class="native"></generator>
                </id>
                <property name="name" column="name"></property>
                <one-to-one name="address" class="com.cad.domain.Address" ></one-to-one>
            </class>
         </hibernate-mapping> 

        Address.hbm.xml
         <hibernate-mapping >
            <class name="com.cad.domain.Address" table="address">
                <id name="id" column="id">
                    <!--必须使用foreign标识符生成策略,还要指定哪个对象共享OID-->
                    <generator class="foreign">
                        <param name="property">company</param>
                    </generator>
                </id>
                <property name="name" column="name"></property>
                <!--constrained属性设为true,说明主键同时作为外键-->
                <one-to-one name="company" class="com.cad.domain.Company" constrained="true"></one-to-one>
            </class>
         </hibernate-mapping>

  

原文地址:https://www.cnblogs.com/yuexiaoyun/p/9452411.html

时间: 2024-12-10 14:27:07

(十)Hibernate的一对一关联关系的相关文章

Hibernate映射一对一关联关系

映射一对一关联 Hibernate提供了两种映射一对一关联关系的方式,分别是按照外键映射和按照主键映射. 下面是员工表和档案信息表(员工和档案表之间的关系是一对一的关系)  档案表(dept) 1 public class Dept { 2 private Integer deptid; 3 private String mystreet; 4 private Emp emp; 5 6 public Dept() { 7 } 8 9 public Dept(Integer deptid, Str

Hibernate关联关系映射之一对一关联关系

人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package entity; public class Person {     private Integer id;     private String name;     pr

Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/Annotation) 联合主键 一对一单向外键联合主键(Xml/Annotation) 一对一组件关联(XML/Annotation) 理解组件 领域驱动设计——自动生成数据库脚本 一对一关系的小结 一些出错问题的总结 自动生成数据库脚本 一般在项目开发过程中,我们的习惯是先建好数据库和表,然后在进

Hibernate 一对一关联关系

在Hibernate中,一对一关联关系有两种情况: 基于外键映射的一对一 基于主键映射的一对一 基于外键映射的一对一 这种映射其实是由多对一而来,这种映射情况下,外键可以放在任意的一端,在需要存放外键的一端(简称a端),添加<many-to-one>节点,为<many-to-one>节点增加unique="true"属性来约束多对一成为一对一,另一端(简称b端)使用<one-to-one>节点来映射,并增加property-ref属性指定使用在该端(

jpa的双向一对多和双向一对一关联关系

在分享之前先给大家看两个异常,应该说这一类的异常还是很常见的,主要原因是jar包冲突 异常1: java.lang.NoSuchFieldError: INSTANCE at org.hibernate.type.BasicTypeRegistry.<init>(BasicTypeRegistry.java:94) at org.hibernate.type.TypeResolver.<init>(TypeResolver.java:59) at org.hibernate.cfg

EnityBean一对一关联关系

一.工程架构: 工程资源下载地址:http://download.csdn.net/detail/u012750578/7660633 二.beans.xml配置 <?xml version="1.0" encoding="UTF-8"?> <!-- 基于注解方式 http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring http://ehcache-spr

grails一对一关联关系

一对一关联关系开发中用的没有一对多那么广泛,但是我觉得掌握以下还是有必要的,一对一关联关系有一张表存在外键,引用的一般是主表的主键.grails也对一对一关联关系提供了很好的支持,配置也是简单的不得了.grails配置一对一可以有下面三种选择: class Face { Nose nose } class Nose { } 这种属于单向关联,下面的这种则是双向关联,但是不能级联更新 class Face { Nose nose } class Nose { Face face } 接下来这种我觉

Hibernate多对多关联关系

前两篇说了 Hibernate 的一对一和一对多, 这一篇说一下 Hibernate 关联关系中的多对多. 说完这个Hibernate的关联关系就结束了. 分类: 1. 单向多对多 2. 双向多对多 要想实现多对多关系, 必须提供中间表, 用外键的方式无法实现. 这里咱们用 分类(Category)和单品(Item) 来举例子. OneByOne 一: 单向多对多 准备工作: 1. 建立持久化类 Category类: package com.single.many2many; import ja

【Hibernate】——一对一关联映射

两个对象之间如果是一对一的关系,如Person-IdCard.在Hibernate中有两种策略可以实现一对一的关联映射: 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表得主键来关联. 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系: 而每种策略又分为两种方向的对应关系,即单向一对一关系和双向一对一关系.分类的原因一般是由需求决定的,单双向是站在不同的角度去看人