一对一外键配置

编写JavaBean

在这里插入图片描述
在这里插入图片描述

编写映射文件

Company.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="org.ccit.com.domain.Company" table="t_company">
      <id name="id" column="id">
          <generator class="native"></generator>
      </id>
        <property name="name" length="20"></property>
<!--        property-ref 非主键关联 默认property-ref="company"-->
        <one-to-one name="address" class="org.ccit.com.domain.Address" ></one-to-one>
    </class>
</hibernate-mapping>

Address.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="org.ccit.com.domain.Address" table="t_address">
      <id name="id" column="id">
          <generator class="native"></generator>
      </id>
        <property name="name" length="20"></property>

<!--        设置为多对一 设置外键唯一 起到一对一效果 -->
        <many-to-one name="company" class="org.ccit.com.domain.Company" unique="true" column="company_id"></many-to-one>
    </class>
</hibernate-mapping>

编写测试类

import org.ccit.com.domain.Address;
import org.ccit.com.domain.Company;
import org.ccit.com.uitls.HibernateUtils;
import org.hibernate.Session;
import org.junit.Test;

/**
 * @program: Hibernate_01
 * @description
 * @author: LIANG
 * @create: 2021-03-12 15:31
 **/
public class HibernateTest11 {
    @Test
    public void method01(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();

        Company company = new Company();
        company.setName("01有限公司");

        Address address = new Address();
        address.setName("长春市");

        address.setCompany(company);

        session.save(company);
        session.save(address);

        session.getTransaction().commit();
        session.close();
    }
}

另一种 配置方式 直接将主键当做外键使用

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="org.ccit.com.domain.Company" table="t_company">
      <id name="id" column="id">
          <generator class="native"></generator>
      </id>
        <property name="name" length="20"></property>
        <one-to-one name="address" class="org.ccit.com.domain.Address"></one-to-one>
    </class>
</hibernate-mapping>

constrained(约束),只能在one-to-one的映射中使用,一般在主表映射中,有外键的那个表,如果constrained=true,
则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应,另外,改选项最关键的是影响save和deleted先后顺序,
如果是增加的时候,如果constrained=true则会增加关联表,然后增加本表,删除的时候是先伸出本表然后删除关联的表
one-to-one的单向关联中,如果constrained=false则会在查询的时候全部取出来,用left outer join的方式
如果constrained=true,hibernate会延迟加载sql,只会把主表查询出来,等有用到关联表的时候再发出sql语句去取出来

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="org.ccit.com.domain.Address" table="t_address">
      <id name="id" column="id">
          <generator class="foreign">
              <param name="property">company</param>
          </generator>
      </id>
        <property name="name" length="20"></property>

<!--        设置为多对一 设置外键唯一 起到一对一效果
-->
        <one-to-one name="company" class="org.ccit.com.domain.Company" constrained="true"></one-to-one>
    </class>
</hibernate-mapping>

读取数据

 @Test
    public void method02(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Company company= (Company)session.get(Company.class, 1);
        System.out.println(company.getName()+":"+company.getAddress().getName());
        session.getTransaction().commit();
        session.close();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值