Hibernate-----一对一共享主键关联映射(映射文件方式)

共享主键关联映射:让两个对象具有相同的主键值,以表明他们之间的一对一对应的关系;数据库表不会有额外的字段来维护他们之间的关系,仅通过表的主键来关联

一、单向关联映射:

One(维护端:Person)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
         <!-- 1-1:Person(维护端)【多】 to IdCard【一】) -->
         <class name="Person" table="t_person">
                   <idname="id">
                            <!-- 采用foreign生成策略,foreign会取得关联对象的标识 -->
                            <generatorclass="foreign">
                                     <!-- property值是关联的对象 -->
                                     <paramname="property">idCard</param>
                            </generator>
                   </id>
                   <propertyname="name" />

                   <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载;也就是拿到关系字段值,根据另外一端的主键来加载关联对象 -->
                   <!-- 维护关系:constrained=true:表示当前主键还是一个外键;指向另外一端的主键,也就是会生成外键约束语句(唯一) 【在‘多’端添加外键(‘多’端主键)指向‘一’的一端】 -->
                   <one-to-onename="idCard" constrained="true"/>
         </class>
</hibernate-mapping>

To

One(非维护端:IdCard)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="IdCard" table="t_idCard">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="cardNo"/>
    </class>
</hibernate-mapping>
public void testOneToOne(){
       Session session = null;
       try {
           session = HibernateUtils.getSession();
           session.beginTransaction();
             //
           IdCard idCard = new IdCard();
           idCard.setCardNo("111111");

            //
           Person person = new Person();
           person.setName("name");
           person.setIdCard(idCard);
           // 一对一关联映射的特性决定了保存person时会先保存关联对象(idCard)(默认了级联属性);故保存person时可不用显示保存IdCard
           // 维护端要最后保存
           session.save(person);
           session.getTransaction().commit();
       } catch (Exception e) {
           e.printStackTrace();
           session.getTransaction().rollback();
       } finally {
           HibernateUtils.closeSession(session);
       }
    }

二、双向关联映射

One(Person:维护端)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="Person" table="t_person">
       <id name="id">
           <generator class="foreign">
              <param name="property">idCard</param>
           </generator>
       </id>
       <property name="name"/>

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

To

One(IdCard:非维护端)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="IdCard" table="t_idCard">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="cardNo"/>

       <!-- 这里不影响存储(即设置先设置Person而不保存,再保存IdCard的时候并不会关联保存Person),只影响加载(维护端还是Person) -->
       <one-to-one name="person"/>
    </class>
</hibernate-mapping>
时间: 2024-10-28 07:14:52

Hibernate-----一对一共享主键关联映射(映射文件方式)的相关文章

hibernate5(13)注解映射[5]一对一共享主键关联

一对一共享主键 下面我们直接通过实例来讲解共享主键配置: 主键主控方:Article package com.zeng2.model; @Table(name = "t_article2") @Entity public class Article { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String title; @OneToOne(cascade = Casc

hibernate一对一双向外键关联

一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card") //被控方 主控方必须交给其中的一方去控制,因为不可以双方都同时拥有控制对方的权利,假如是这样的话是没有办法保存成功的.这就是为什么需要指定mappenBy="card"的原因. 1.IdCard.java实体类: package oto_bfk; import javax.persi

hibernate一对一单向外键关联

Husband类里有一个Wife类的引用 wife类: package com.oracle.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Wife { private int id; private int age; @Id @GeneratedValue public i

Hibernate-----一对一共享主键关联映射(注解)

One('多') import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import org.hibernate.annotations.GenericGenerator; import org.hib

【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联

一对一的映射在对象模型中是经常见到的,主要是将对象模型转换为关系模型就必须在映射文件中进行配置,重点是<one-to-one>标签的使用,有两种方式,第一是主键关联,第二是唯一外键关联,现在先来看第一种方式. 一对一的关联映射中的主键关联,就是说两个对象具有相同的主键值,以表明它们之间的一一对应的关系,数据库表不会有额外的字段来维护它们之间的关系,仅仅是通过表的主键来关联. 上图的Person类和IdCard类之间是一一对应关系,一个人就只能有一个身份证,一个身份证只能对应一个人,那么身份证的

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

2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate映射文件中主键自增规则.Hibernate实例状态(瞬时状态.持久化状态.托管状态).Hibernate初始化类获取session等方法 下图内容保存数据过程 下面内容保存数据顺序.查询数据方法 get().load()和延迟加载.删除数据 下图内容删除对象顺序.修改数据顺序 下面内容关联关系映射.

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

009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联. 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系. 实例场景:人—-> 身份证号(PersonàIdCard),从IdC

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

²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联. 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系. 实例场景:人<—-> 身份证号(Person<->IdCard)双向:互相持有对方的引用 IdCard实体类: p

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

²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联. 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系. 实例场景:人—-> 身份证号(PersonàIdCard),从IdCard看不到Person对象 对象模型实体类与一对一主键关联