一对多关系映射

2024-08-31 13:18
文章标签 关系 映射 一对

本文主要是介绍一对多关系映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

两张表之间如果存在外键,就会出现一对多关系(外键不能同时是主键)

如果想使用pojo类来表示一对多关系,这里以省份和城市为例:

省份类中应该包含多个城市的对象,一般默认使用Set集合表示某个省份下多个城市

城市类中应该包含一个省份的对象。

 

如果在表中存在外键,且使用MyEclipse一起选择两张表生成映射,则会自动生成出一对多关系。

先建立省份和城市表。

CREATE TABLE province (
       id                     number(8)               primary key ,
       title                  varchar2(50)      not null                 
);

INSERT INTO province VALUES (1,'江苏');
INSERT INTO province VALUES (2,'广东');
INSERT INTO province VALUES (3,'河南');


CREATE TABLE city (
       id                     number(8)               primary key ,
       title                  varchar2(50)      not null,
       province_id            number(8)               ,
       foreign key (province_id) references province (id) on delete cascade
);

INSERT INTO city VALUES (1,'南通¨',1);
INSERT INTO city VALUES (2,'南京',1);
INSERT INTO city VALUES (3,'苏州',1);
INSERT INTO city VALUES (4,'广州',2);
INSERT INTO city VALUES (5,'深圳',2);
INSERT INTO city VALUES (6,'洛阳',3);
INSERT INTO city VALUES (7,'南阳',3);

COMMIT;


生成映射:


public class Province implements java.io.Serializable {

 

    private Integer id;

    private String title;

    private Set cities = new HashSet(0);

public class City implements java.io.Serializable {

 

    private Integer id;

    private Province province;

    private String title;


通过映射文件描述了这种一对多关系。

<?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>

    <class name="org.liky.primary.pojo.Province" table="PROVINCE" schema="SUNXUN">

        <id name="id" type="java.lang.Integer">

            <column name="ID" precision="8" scale="0" />

            <generator class="increment" />

        </id>

        <property name="title" type="java.lang.String">

            <column name="TITLE" length="50" not-null="true" />

        </property>

        <!--

        Province中存在一个名称为citiesSet集合

        -->

        <set name="cities" inverse="true">

        <!--

            关联外键是PROVINCE_ID

        -->

            <key>

                <column name="PROVINCE_ID" precision="8" scale="0" />

            </key>

            <!--

              表示当前类(Province)City类存在一对多关系

            -->

            <one-to-many class="org.liky.primary.pojo.City" />

        </set>

    </class>

</hibernate-mapping>

 

<?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>

    <class name="org.liky.primary.pojo.City" table="CITY" schema="SUNXUN">

        <id name="id" type="java.lang.Integer">

            <column name="ID" precision="8" scale="0" />

            <generator class="increment" />

        </id>

        <!--

        当前类(city)Province存在多对一关系,关联的对象是province,表中关联的字段是province_id

        -->

        <many-to-one name="province" class="org.liky.primary.pojo.Province" fetch="select">

            <column name="PROVINCE_ID" precision="8" scale="0" />

        </many-to-one>

        <property name="title" type="java.lang.String">

            <column name="TITLE" length="50" not-null="true" />

        </property>

    </class>

</hibernate-mapping>

 

 

Inverse=”true”表示:关联关系反转,也就是关联关系由对方进行维护。

 

关联关系在这里指的是外键字段province_id,该字段是city表的,也就是说修改city表,才可以修改这个字段,也就可以说city表维护着关联关系。对于Province来说,对方就是city,也就是说关联关系由对方(city)来维护。

 

    public static void main(String[] args) {

        City c = (City) HibernateSessionFactory.getSession().get(City.class, 5);

       

        System.out.println(c.getTitle());

        System.out.println(c.getProvince().getTitle());

 

    }

通过这段测试,可以看出fetch的作用

使用get或load方法按主键查询时,如果fetch=”select”,是懒汉式加载,先查询出城市信息,当用到省份信息时,再查询省份。

Fetch=”join”,则是一次关联查询将省份和城市一起取得。

 

使用了一对多关系后,Hibernate可以自动根据关联关系,将关联数据取得。

例如:

查询省份,可以自动将所有城市也列表显示出来。

        String hql = "FROM Province";

        List<Province> allP = HibernateSessionFactory.getSession().createQuery(

                hql).list();

 

        Iterator<Province> iter = allP.iterator();

        while (iter.hasNext()) {

            Province p = iter.next();

            System.out.println(p.getTitle());

 

            Iterator<City> iter2 = p.getCities().iterator();

            while(iter2.hasNext()) {

                City c = iter2.next();

                System.out.println(" |- " + c.getTitle());

            }

 

        }
















这篇关于一对多关系映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124013

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip