关联是类(类的实例)之间的关系,表示有意义和值得关注的连接。

本系列将介绍Hibernate中主要的几种关联映射

Hibernate一对一主键单向关联
Hibernate一对一主键双向关联
Hibernate一对一外键单向关联
Hibernate一对一外键双向关联
Hibernate多对一单向关联
Hibernate多对一双向关联

Hibernate多对多关联

代码都写有注释,主要包括(核心配置文件,实体映射文件,实体类,测试类,数据库)主要操作有增删改查。

本篇主要介绍Hibernate一对一外键双向关联:

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
      <!-- 配置数据库连接驱动类 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 配置数据库连接字符串 -->
        <property name="connection.url"><![CDATA[jdbc:mysql://localhost:3306/test111?useUnicode=true&characterEncoding=utf8]]></property>
        <!-- 配置数据库连接用户名 -->
        <property name="connection.username">root</property>
        <!-- 配置数据库连接密码 -->
        <property name="connection.password">123456</property>
        <!-- 配置数据库方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 配置数据库表生成策略 -->
        <!--<property name="hibernate.hbm2ddl.auto">update</property> -->
        <!-- 配置是否打印显示SQL语句 -->
        <property name="show_sql">true</property>
        <!-- 配置是否格式化显示SQL语句 -->
        <property name="format_sql">true</property>
        <!-- 配置hibernate是否自动提交事务 -->
        <!--<property name="hibernate.connection.autocommit">true</property> -->
        <!-- 配置实体类对应的映射文件 -->

<!-- 一对一双向外键关联 --> <mapping resource="com/great/entity5/People.hbm.xml"></mapping> <mapping resource="com/great/entity5/IdCard.hbm.xml"></mapping> </session-factory> </hibernate-configuration>

People.hbm.xml

<?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="com.great.entity5">
    <!-- 配置实体类与数据库表的映射关系 -->
    <class name="People" table="people1">
        <!-- 配置主键映射关系 -->
        <id name="id" column="id" type="int">
            <!-- 配置主键生成策略 这个主键生成策略并没有什么影响 -->
            <generator class="native">
            </generator>
        </id>
        <!-- 配置属性和表字段映射关系 一对外键一双向关联 -->
        <property name="pName" column="pName" type="string"></property>
        <many-to-one name="idCard" unique="true" cascade="all">
            <column name="card_id"></column>
        </many-to-one>
    </class>
</hibernate-mapping>

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.great.entity5">
    <class name="IdCard" table="idcard1">
        <id name="card_id" column="id" type="int">
            <generator class="identity">
            </generator>
        </id>
        <!-- 配置属性和表字段映射关系 一对一外键双向关联 -->
        <property name="cardCode" column="cardCode" type="string"></property>
        <one-to-one name="people" class="com.great.entity5.People"
            cascade="all" property-ref="idCard" />
    </class>
</hibernate-mapping>

People.java

package com.great.entity5;

public class People {
    // 一对一外键双向关联
    private int id;
    private String pName;
    private IdCard idCard;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getpName() {
        return pName;
    }

    public void setpName(String pName) {
        this.pName = pName;
    }

    public IdCard getIdCard() {
        return idCard;
    }

    public void setIdCard(IdCard idCard) {
        this.idCard = idCard;
    }

}

IdCard.java

package com.great.entity5;

public class IdCard {
    // 一对一外键双向关联
    private int card_id;
    private String cardCode;
    private People people;

    public int getCard_id() {
        return card_id;
    }

    public void setCard_id(int card_id) {
        this.card_id = card_id;
    }

    public String getCardCode() {
        return CardCode;
    }

    public void setCardCode(String cardCode) {
        CardCode = cardCode;
    }

    public People getPeople() {
        return people;
    }

    public void setPeople(People people) {
        this.people = people;
    }
}

TestOneToOneForeignBoth.java(测试类)

package com.great.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.great.entity5.IdCard;
import com.great.entity5.People;

public class TestOneToOneForeignBoth {
    static Session session;

    // 一对一外键双向关联
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        // 加载hibernate主配置文件
        Configuration cfg = new Configuration().configure();
        // 构建session工厂
        SessionFactory sf = cfg.buildSessionFactory();
        // 打开session
        session = sf.openSession();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        // 关闭session,释放资源
        session.close();
    }

    // select1,通过people
    @Test
    public void testOneToOneSelect1() {
        People people = (People) session.get(People.class, 1);
        System.out.println("身份证号码:" + people.getIdCard().getCardCode());
        System.out.println("姓名是:" + people.getpName());
    }

    // select2,通过idCard
    @Test
    public void testOneToOneSelect2() {
        IdCard idCard = (IdCard) session.get(IdCard.class, 1);
        System.out.println("身份证号码:" + idCard.getCardCode());
        System.out.println("姓名是:" + idCard.getPeople().getpName());
    }

    // insert1数据,通过保存people来插入数据
    @Test
    public void testOneToOneSave1() {
        Transaction ts = session.beginTransaction();
        IdCard idCard = new IdCard();
        idCard.setCardCode("124567891234566");
        People people = new People();
        people.setpName("张起灵2");
        idCard.setPeople(people);// 可加可不加
        people.setIdCard(idCard);
        session.save(people);
        ts.commit();
    }

    // insert2数据,通过保存inCard来插入数据
    @Test
    public void testOneToOneSave2() {
        Transaction ts = session.beginTransaction();
        IdCard idCard = new IdCard();
        idCard.setCardCode("124567891234566");
        People people = new People();
        people.setpName("张起灵2");
        people.setIdCard(idCard);// 必须加,否则失败
        idCard.setPeople(people);
        session.save(idCard);
        ts.commit();
    }

    // delete1数据,删除people,级联删除inCard。发出两条查询两条删除语句
    @Test
    public void testOneToOneDelete1() {
        Transaction ts = session.beginTransaction();
        People people = (People) session.get(People.class, 12);
        session.delete(people);
        ts.commit();
    }

    /*
     * delete2数据,通过删除idCard,级联删除people.
     * delete数据。发出两条查询两条删除语句,也是先删除people再删除idCard
     */
    @Test
    public void testOneToOneDelete2() {
        Transaction ts = session.beginTransaction();
        IdCard idCard = (IdCard) session.get(IdCard.class, 14);
        session.delete(idCard);
        ts.commit();
    }

    // 更新数据1,通过people进行更新
    @Test
    public void testOneToOneUpdate1() {
        Transaction ts = session.beginTransaction();
        People people = (People) session.get(People.class, 11);
        people.setpName("张起灵1");
        people.getIdCard().setCardCode("511381199612120254");
        /*
         * session.update(people);
         * update和saveOrUpdate的区别在于后者在数据库中不存在此对象的情况下插入,所以效率低。
         */
        session.saveOrUpdate(people);
        ts.commit();
    }

    // 更新数据2,通过idCard进行更新
    @Test
    public void testOneToOneUpdate2() {
        Transaction ts = session.beginTransaction();
        IdCard idCard = (IdCard) session.get(IdCard.class, 8);
        idCard.getPeople().setpName("张起灵3");
        idCard.setCardCode("311381199612120254");
        session.update(idCard);
        ts.commit();
    }
}

数据库:

people1表

三个字段id pName card_id(外键)

idcard1表

两个字段id cardCode

注意:在people表的card_id上建立外键关系。

hibernate一对一外键双向关联的更多相关文章

  1. Hibernate一对一外键双向关联(Annotation配置)

    如上图所示:一个学生有一个学生证号,一个学生证号对应一名学生.在Hibernate中怎么用Annotation来实现呢? 学生类,主键是id:学生证的主键也是Id: Student.java pack ...

  2. hibernate一对一外键单向关联

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

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

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

  4. hibernate一对一主键单向关联

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

  5. Hibernate一对一外键映射

    Hibernate 一对一外键映射                    ------------------------------                            ----- ...

  6. Hibernate,一对一外键单向 记录。Timestamp 的一个坑。

    首先是2张表 表A: 表B: 其中表B中的FormBaseId对应表A中的SubjectID. 数据库中没有设置外键关系. 下面是2个对应的实体 package questionnaire.model ...

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

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

  8. ORM框架Hibernate (四) 一对一单向、双向关联映射

    简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...

  9. hibernate之关于一对一单向,双向关联映射

    [hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...

随机推荐

  1. 理解CSS边框border

    前面的话   边框是CSS盒模型属性中默默无闻的一个普通属性,CSS3的到来,但得边框属性重新焕发了光彩.本文将详细介绍CSS边框 基础样式   边框是一条以空格分隔的集合样式,包括边框粗细(边框宽度 ...

  2. RPC 使用中的一些注意点

    最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...

  3. [译]ZOOKEEPER RECIPES-Leader Election

    选主 使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志.主要思想是,使用一个znode,比如"/election",每个客 ...

  4. 02.LoT.UI 前后台通用框架分解系列之——灵活的菜单栏

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  5. 自定义Inspector检视面板

    Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [Sys ...

  6. echarts+php+mysql 绘图实例

    最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...

  7. 一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)

    在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文 ...

  8. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  9. JavaScript实现DOM对象选择器

    目的: 根据传入的选择器类型选出第一个符合的DOM对象. ①可以通过id获取DOM对象,例如 $("#adom"); ②可以通过tagName获取DOM对象,例如 $(" ...

  10. ASP.NET中画图形验证码

    context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...