3.7 将单向关联改为双向

【1】单向、双向关联

单向和双向关联的区别:两个类是否需要互相知道。

如果类A需要知道类B,而类B也需要知道类A,那么这两个类就应该是双向关联的。如果类A只需要知道类B,而类B不需要知道类A,那么就是单向关联。

【2】将单向关联改为双向

范例:

2.1 order类

order.h

 1 #ifndef ORDER
 2 #define ORDER
 3
 4 #include <QString>
 5 #include "customer.h"
 6
 7 // 订单类
 8 class Order
 9 {
10 public:
11     Order(int nId = 1, QString name = QString(), Customer* pCustomer = NULL);
12
13     int getId();
14     void setId(int nId);
15     QString getName();
16     void setName(QString name);
17     // 获取订单的客户对象
18     Customer* getCustomer();
19     // 设置订单的客户对象
20     void setCustomer(Customer *pObj);
21
22 private:
23     int m_nId;
24     QString m_name;
25     Customer *m_pCustomer;
26 };
27
28 #endif // ORDER

order.cpp

 1 #include "order.h"
 2
 3 // 订单类
 4 Order::Order(int nId, QString name, Customer* pCustomer)
 5     : m_nId(nId)
 6     , m_name(name)
 7     , m_pCustomer(pCustomer)
 8 {
 9     if (m_pCustomer)
10     {
11         m_pCustomer->friendOrders().insert(m_nId);
12     }
13 }
14
15 int Order::getId()
16 {
17     return m_nId;
18 }
19 void Order::setId(int nId)
20 {
21     m_nId = nId;
22 }
23 QString Order::getName()
24 {
25     return m_name;
26 }
27 void Order::setName(QString name)
28 {
29     m_name = name;
30 }
31
32 // 获取订单的客户对象
33 Customer* Order::getCustomer()
34 {
35     return m_pCustomer;
36 }
37
38 // 设置订单的客户对象
39 void Order::setCustomer(Customer *pObj)
40 {
41     if (m_pCustomer == pObj)
42     {
43         return; // 如果订单的客户本来就是pObj,那么直接退出。
44     }
45
46     if (m_pCustomer != NULL)
47     {
48         m_pCustomer->friendOrders().remove(m_nId); // 从原客户的订单集合中删除这个订单项
49     }
50     m_pCustomer = pObj;  // 更换客户对象
51     if (m_pCustomer != NULL)
52     {
53         m_pCustomer->friendOrders().insert(m_nId); // 在新客户的订单集合中添加这个订单项
54     }
55 }

2.2 customer类

customer.h

 1 #ifndef CUSTOMER
 2 #define CUSTOMER
 3
 4 #include <QString>
 5 #include <QSet>
 6
 7 class Order;
 8 // 客户类
 9 class Customer
10 {
11 public:
12     Customer(QString name = QString("sys"));
13     // 获取客户的订单集合
14     QSet<int>& friendOrders();
15
16     // 获取客户名称
17     QString getName();
18     // 设置客户名称
19     void setName(QString name);
20
21     void addOrder(Order* pOrder);
22 private:
23     QString m_name;
24     QSet<int> m_orders;
25 };
26 #endif // CUSTOMER

customer.cpp

 1 #include "customer.h"
 2 #include "order.h"
 3
 4 // 客户类
 5 // 获取客户的订单集合
 6 Customer::Customer(QString name) : m_name(name)
 7 {
 8 }
 9
10 QSet<int>& Customer::friendOrders()
11 {
12     return m_orders;
13 }
14
15 // 获取客户名称
16 QString Customer::getName()
17 {
18     return m_name;
19 }
20
21 // 设置客户名称
22 void Customer::setName(QString name)
23 {
24     m_name = name;
25 }
26
27 // 添加订单项
28 void Customer::addOrder(Order* pOrder)
29 {
30     if (pOrder != NULL)
31     {
32         pOrder->setCustomer(this);
33     }
34 }

2.3 main函数

 1 #include "customer.h"
 2 #include "order.h"
 3
 4 void main()
 5 {
 6     Customer* pCustomerLiu = new Customer("liu");
 7     QList<Order*> orders;
 8     for (int i = 0; i < 10; ++i)
 9     {
10         // 创建10个订单,使其客户对象均为liu
11         orders.append(new Order(i + 1, QString("item%1").arg(i + 1), pCustomerLiu));
12     }
13
14     Customer* pCustomerSun = new Customer("sun");
15     orders.back()->setCustomer(pCustomerSun); // 最后一个订单的客户对象修改为sun
16
17     Customer* pCustomerQin = new Customer("qin");
18     orders.at(0)->setCustomer(pCustomerQin); // 第一个订单的客户对象修改为qin
19
20     Order* pNewOrder = new Order(110, QString("item110"), NULL);
21     pNewOrder->setCustomer(pCustomerQin); // 新建一个订单,设置其客户对象为qin
22 }

【3】总结

两个类都需要使用对方特性,但其间只有一条单向连接。添加一个反向指针,并使修改函数能够同时更新两条连接。

Good Good Study, Day Day Up.

顺序 选择 循环 总结

时间: 2024-11-08 21:47:56

3.7 将单向关联改为双向的相关文章

hibernate(四)一对多单向、多对一双向、自身双向关联

?经过前几篇文章的简略总结,主要认识了关于hibernate的基本认识,顺便认识了hibernate的简单的一个原理.具体参见 Hibernate (一)hibernate入门 Hibernate(二)hibernate原理简单实现对比JDBC hibernate(三)入门级--hibernate实例 从这篇文章开始就接触具体hibernate是如何来配置使用,更多的是一些细节的掌握.首先需要声明的是作者也是在诸多资料和工作学习中不断在更新自己关于知识的理解,难免出现一些在现阶段的主观认识和片面

Hibernate中用注解配置一对多双向关联和多对一单向关联

Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解开发包 配置持久化类 配置关联关系 下面我们先从多对一单向关联关系讲起,多对一单向关联就是在多的一方植入一的一方的主键作为外键,下面我们先进行初始配置, 在配置的过程中我们会遇到一个问题  就是无论用load还是get都不会出现延迟加载,那么我们应该如何设置为要延迟加载,这样做的好处是可以在用的时候

Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同时加载多的一端的数据 多对一关联映射是指在加载多的一端数据的同时加载一的一端的数据 而单向一对多关联映射是在一的一端维护关系的,具有以下的缺点: 必须先保存多的一端后才可以保存一的一端,所以在保存多的一端时多的一端不知道一的一端是否 存在相应的数据,所以只能将维护的关系字段设置为null,如果为非空

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

2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate映射文件中主键自增规则.Hibernate实例状态(瞬时状态.持久化状态.托管状态).Hibernate初始化类获取session等方法 下图内容保存数据过程 下面内容保存数据顺序.查询数据方法 get().load()和延迟加载.删除数据 下图内容删除对象顺序.修改数据顺序 下面内容关联关系映射.

Hibernate ORM框架——续第二章:Hibernate映射关系:单向关联

一:课堂笔记 **********单表映射*************** 1.只有一个实体类映射一个表 2.有一个实体类+ 一个或者多个值类型,合在一起 映射为一个表 **********多表映射*************** 定义:类有多个映射为多个表 **********数据库层面,如ORM无关************** 2个表之间要建立关系?该如何做?有多少种方法 假定有2个表,分别为A,B 3种关系 a)主键关联:A表的主键对应B表的主键,(一对一的关系) 在数据库种如何建立这种关系?

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识. [SSH进阶之路]Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单. [SSH进阶之路]Hiberna

hibernate5(10)注解映射[2]一对多单向关联

在上一篇文章里.我们从端方向一端建立关联关系,完毕了从文章到作者的关联关系建立.但在实际的博客站点中,用户肯定还须要获取自己所写的文章,这时能够建立用户(一)对文章(多)的单向关联映射. 先来看我们的一方配置实例 package com.zeng.model; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.F

hibernate5(9)注解映射[1]一对多单向关联

一对多单向关联映射 在实际的博客网站中,用户肯定需要获取自己所写的文章,这时可以建立用户(一)对文章(多)的单向关联映射. 先来看我们的一方配置实例 package com.zeng.model; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persisten

一口一口吃掉Hibernate(五)——一对多单向关联映射

版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] 在上一篇博客<一口一口吃掉Hibernate(四)--多对一单向关联映射>中,介绍了多对一的关联映射,今天就反过来说一下一对多的单向关联映射. 可能有人会对这2篇博客的题目有点混淆不清,跟日常说的关系有点不同.我们日常说的比如父子关系,夫妻关系都是说的双向关系,而现在讨论的则是单向关系,所以也就有了多对一和一对多的说法. 二者的关系其实很简单,只是