热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Hibernate关联关系映射(单向篇)-mysql教程

Hibernate关联关系可分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多4种关联方式,而多向关联可以分为一对一、一对多和多对多3种关联方式。Hibernate连接管理类HibernateUtil.javapublicclassHibernateUtil{privatest

Hibernate关联关系可分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多4种关联方式,而多向关联可以分为一对一、一对多和多对多3种关联方式。 Hibernate连接管理类HibernateUtil.java public class HibernateUtil { private st

Hibernate关联关系可分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多4种关联方式,而多向关联可以分为一对一、一对多和多对多3种关联方式。

Hibernate连接管理类HibernateUtil.java

public class HibernateUtil {
    private static SessionFactory sessionFactory;

    private static final ThreadLocal threadLocal = new ThreadLocal();

    static{
        try{
            Configuration cfg = new Configuration().configure();
            sessiOnFactory= cfg.buildSessionFactory();
        }catch(Throwable ex){
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    public static Session getSession() throws HibernateException{
        Session session = (Session)threadLocal.get();
        if(session == null || !session.isOpen()){
            session = (sessionFactory != null)?sessionFactory.openSession():null;
            threadLocal.set(session);
        }

        return session;
    }

    public static void closeSession() throws HibernateException{
        Session session = (Session)threadLocal.get();
        threadLocal.set(null);
        if(session != null){
            session.close();
        }
    }

    public static void shutdown(){
        getSessionFactory().close();
    }

}

1.单向的一对一关联

(1)通过主键关联

通过主键关联,是指两个数据表之间通过主键建立一对一的关联关系。这两张表的主键值是相同的,一张表改动时,另一张也会相关的发生改变,从而避免多余字段被创建,但基于主键关联的持久化类(其对应的数据表称为从表)不能拥有自己的主键生成策略,它的主键由关联类负责生成。另外,增加one-to-one元素来关联属性,必须为one-to-one元素增加cOnstrained=”true”属性,表明该类主键由关联类生成。

示例:

实体类:

User.java

public class User {
    private int userid;
    private String name;
    private String password;
    private Address address;
    public int getUserid() {
        return userid;
    }
    public void setUserid(int userid) {
        this.userid = userid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }   
}

Address.java

public class Address {
    private int addressid;
    private String addressinfo;
    public int getAddressid() {
        return addressid;
    }
    public void setAddressid(int addressid) {
        this.addressid = addressid;
    }
    public String getAddressinfo() {
        return addressinfo;
    }
    public void setAddressinfo(String addressinfo) {
        this.addressinfo = addressinfo;
    }


}

表结构:

user表:

这里写图片描述

address表:

这里写图片描述

配置文件:

User.hbm.xml


    <class name="com.entity.User" table="user">
        <id name="id" type="java.lang.Integer" column="user_id">
            class="foreign">
                name="property">address
            
        id>

        <property name="name" type="java.lang.String" column="name">
        property>
        <property name="password" type="java.lang.String" column="password">
        property>
        to-one name="address" class="Address" cOnstrained="true">to-one>

    class>

Address.hbm.xml


    <class name="com.entity.Address" table="address">
        <id name="addressid" type="java.lang.Integer" column="addressid">
            class="identity"/>
        id>

        <property name="addressinfo" type="java.lang.String" column="addressinfo">
        property>


    class>

测试类Test.java

public class Test {
    public static void main(String[] args){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        User u = new User();
        u.setName("sbw");
        u.setPassword("123");

        Address a = new Address();
        a.setAddressinfo("heu");
        u.setAddress(a);

        session.save(a);
        session.save(u);
        tx.commit();

        HibernateUtil.closeSession();

    }
}

运行结果:

这里写图片描述

(2)通过外键关联

通过外键关联时两张数据表的主键是不同的,通过在一张表中添加外键列来保持一对一的关系。配置外键关联关系时需要使用many-to-one元素。因为通过外键关联的一对一关系,本质上是多对一关系的特例。因此,只需在many-to-one元素中增加unique=“true”属性即可,这相当于在多的一端增加了唯一性的约束,表示多的一端也必须是唯一的,这样就变成为单向的一对一关系了。

示例:

实体类与通过主键关联相同。

表结构:

user表

这里写图片描述

address表

这里写图片描述

配置文件:

User.hbm.xml


    <class name="com.entity.User" table="user">
        <id name="userid" type="java.lang.Integer" column="userid">
            class="identity"/>
        id>

        <property name="name" type="java.lang.String" column="name">
        property>
        <property name="password" type="java.lang.String" column="password">
        property>

        to-one name="address" class="com.entity.Address" unique="true" column="addressid">to-one>

    class>

Address.hbm.xml


    <class name="com.entity.Address" table="address">
        <id name="addressid" type="java.lang.Integer" column="addressid">
            class="identity"/>
        id>

        <property name="addressinfo" type="java.lang.String" column="addressinfo">
        property>


    class>

测试类与通过主键关联一样

运行结果:

这里写图片描述

2.单向一对多关联

单向的一对多关联映射关系主要是通过外键来关联的。一对多的关联映射是在表示多的一方的数据表中增加一个外键,并由“一”的一方指向“多”的一方。单向的一对多关联的持久化类里需要包含一个集合属性,在“一”的一方访问“多”的一方时,“多”的一方将以集合的形式来体现。

示例:

实体类:

User.java

public class User {
    private int userid;
    private String name;
    private String password;
    private Set
address = new HashSet
(); public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Set
getAddress() { return address; } public void setAddress(Set
address) { this.address = address; } }

Address.java

public class Address {
    private int addressid;
    private String addressinfo;

    public int getAddressid() {
        return addressid;
    }
    public void setAddressid(int addressid) {
        this.addressid = addressid;
    }
    public String getAddressinfo() {
        return addressinfo;
    }
    public void setAddressinfo(String addressinfo) {
        this.addressinfo = addressinfo;
    }   
}

表结构:

User表

这里写图片描述

Address表

这里写图片描述

配置文件

User.hbm.xml


    <class name="com.entity.User" table="user">
        <id name="userid" type="java.lang.Integer" column="userid">
            class="identity"/>
        id>

        <property name="name" type="java.lang.String" column="name">
        property>
        <property name="password" type="java.lang.String" column="password">
        property>

        <set name="address" table="address" inverse="false" lazy="true">
            
                name="userid"/>
            

            to-many class="com.entity.User"/>
        set>

    class>

Address.hbm.xml


    <class name="com.entity.Address" table="address">
        <id name="addressid" type="java.lang.Integer" column="addressid">
            class="identity"/>
        id>

        <property name="addressinfo" type="java.lang.String" column="addressinfo">
        property>


    class>

测试代码

Test.java

public class Test {
    public static void main(String[] args){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        User u = new User();
        u.setName("sbw");
        u.setPassword("123");

        Address a = new Address();
        a.setAddressinfo("heu");
        Address a1 = new Address();
        a1.setAddressinfo("hrb");

        u.getAddress().add(a);
        u.getAddress().add(a1);

        session.save(a);
        session.save(a1);
        session.save(u);
        tx.commit();

        HibernateUtil.closeSession();

    }
}

运行结果:

这里写图片描述

3.单向的多对一关联

单向的多对一关联映射关系也是通过外键来关联的。多对一的映射方式类似于一对多的映射方式,不过它的映射关系是由“多”的一方指向“一”的一方。在表示“多”的一方的数据表中增加一个外键来指向表示“一”的一方的数据表,“一”的一方作为主表,”多“的一方作为从表。

示例:

实体类

User.java

public class User {
    private int userid;
    private String name;
    private String password;
    private Address address = new Address();

    public int getUserid() {
        return userid;
    }
    public void setUserid(int userid) {
        this.userid = userid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }       
}

Address.java

public class Address {
    private int addressid;
    private String addressinfo;

    public int getAddressid() {
        return addressid;
    }
    public void setAddressid(int addressid) {
        this.addressid = addressid;
    }
    public String getAddressinfo() {
        return addressinfo;
    }
    public void setAddressinfo(String addressinfo) {
        this.addressinfo = addressinfo;
    }   
}

表结构:

user表

这里写图片描述

address表

这里写图片描述

配置文件:

User.hbm.xml


    <class name="com.entity.User" table="user">
        <id name="userid" type="java.lang.Integer" column="userid">
            class="identity"/>
        id>

        <property name="name" type="java.lang.String" column="name">
        property>
        <property name="password" type="java.lang.String" column="password">
        property>

        to-one name="address" column="addressid"/> 

    class>

Address.hbm.xml


    <class name="com.entity.Address" table="address">
        <id name="addressid" type="java.lang.Integer" column="addressid">
            class="identity"/>
        id>

        <property name="addressinfo" type="java.lang.String" column="addressinfo">
        property>


    class>

测试类Test.java

public class Test {
    public static void main(String[] args){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        User u = new User();
        u.setName("sbw");
        u.setPassword("123");

        User u1 = new User();
        u.setName("gaoya");
        u.setPassword("456");

        Address a = new Address();
        a.setAddressinfo("heu");

        u.setAddress(a);
        u1.setAddress(a);

        session.save(a);
        session.save(u);
        session.save(u1);
        tx.commit();

        HibernateUtil.closeSession();

    }
}

测试结果:

这里写图片描述

4.单向的多对多关联

多对多关联在数据库中是比较常见的,它利用中间表将两个主表关联起来。中间表的作用是将两张表的主键作为其外键,通过外键建立这两张表的映射关系。在单向的多对多关联中,需要在主控端的类定义中增加一个Set集合属性,使得被关联一方的类的实例以集合的形式存在。

示例:

实体类:

User.java

public class User {
    private int userid;
    private String name;
    private String password;
    private Set
address = new HashSet
(); public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Set
getAddress() { return address; } public void setAddress(Set
address) { this.address = address; } }

Address.java

public class Address {
    private int addressid;
    private String addressinfo;

    public int getAddressid() {
        return addressid;
    }
    public void setAddressid(int addressid) {
        this.addressid = addressid;
    }
    public String getAddressinfo() {
        return addressinfo;
    }
    public void setAddressinfo(String addressinfo) {
        this.addressinfo = addressinfo;
    }   
}

表结构:

user表:

这里写图片描述

user_address表:

这里写图片描述

address表:

这里写图片描述

配置文件:

User.hbm.xml


    <class name="com.entity.User" table="user">
        <id name="userid" type="java.lang.Integer" column="userid">
            class="identity"/>
        id>

        <property name="name" type="java.lang.String" column="name">
        property>
        <property name="password" type="java.lang.String" column="password">
        property>

        <set name="address" table="user_address">
            "userid"/>
            to-many column="addressid" class="com.entity.Address"/>
        set> 

    class>

Address.hbm.xml


    <class name="com.entity.Address" table="address">
        <id name="addressid" type="java.lang.Integer" column="addressid">
            class="identity"/>
        id>

        <property name="addressinfo" type="java.lang.String" column="addressinfo">
        property>


    class>

测试代码Test.java

public class Test {
    public static void main(String[] args){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        User u = new User();
        u.setName("sbw");
        u.setPassword("123");       
        User u1 = new User();
        u1.setName("gaoya");
        u1.setPassword("456");

        Address a = new Address();
        a.setAddressinfo("heu");
        Address a1 = new Address();
        a1.setAddressinfo("hrb");

        u.getAddress().add(a);
        u.getAddress().add(a1);
        u1.getAddress().add(a);
        u1.getAddress().add(a1);

        session.save(a);
        session.save(a1);
        session.save(u);
        session.save(u1);
        tx.commit();

        HibernateUtil.closeSession();

    }
}

测试结果:

这里写图片描述

推荐阅读
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • 深入解析AUTOSAR方法论:汽车电子系统开发的理论基础(第三部分)
    本文详细探讨了AUTOSAR方法论在汽车电子软件系统开发中的应用,涵盖了从系统配置到生成可执行代码的各个关键步骤。通过介绍各阶段的任务和工具支持,帮助读者全面理解AUTOSAR的设计流程。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 优化Jenkins首次启动速度
    本文详细描述了在启动Jenkins后遇到的长时间加载问题,并提供了一种通过修改更新中心配置文件来显著提升启动速度的有效解决方案。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • 本文探讨了如何在Java中使用JAXB解组两个具有相同名称但不同结构的对象。我们将介绍一个抽象类Bar及其具体实现,并展示如何正确地解析XML文档以获取正确的对象实例。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
author-avatar
jieyang6888_130
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有