一对多关系映射

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

相关文章

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

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

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

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

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这

c++ 和C语言的兼容性关系

C++ 和 C 语言有很高的兼容性,但也存在一些差异和限制。下面是它们的兼容性关系的详细介绍: 兼容性 C++ 是 C 的超集: C++ 语言设计为兼容 C 语言的语法和功能,大部分 C 代码可以在 C++ 编译器中编译运行。 标准库兼容性: C++ 标准库包含了 C 标准库的内容,如 stdio.h、stdlib.h、string.h 等头文件,但 C++ 的标准库也提供了额外的功能,如

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

file-max与ulimit的关系与差别

http://zhangxugg-163-com.iteye.com/blog/1108402 http://ilikedo.iteye.com/blog/1554822

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先,恭喜完成了uboot部分的内容整理,其次补充一点,uboot第一部分和第二部分的工作不是一定的,在不同的版本中,可能这个初始化早一点,那个的又放在了第二部分,版本不同,造成的工作顺序不同,但终归是要完成基本内容初始化并传参给kernel的。         那么至于驱动与内核的关系,用一张图来说明最适合不过:         驱动位于OS层的中下层与硬件相接。驱动是内

docker 重启容器且修改服务映射端口

要重启 Docker 容器并修改服务的映射端口,可以按照以下步骤进行操作: 1. 停止当前运行的容器 如果你想重新配置端口,通常需要先停止当前运行的容器。你可以使用以下命令停止容器: docker stop <container_name_or_id> 2. 删除现有容器 为了修改端口映射,你需要删除旧的容器并重新创建一个新的容器。首先运行以下命令删除停止的容器: docker rm