目录[-]

本节主要介绍ODB中的继承和C++之间的关系。

ORM中的O的关系是很复杂的。其中之一便是对象的继承体系。

在C++语言中支持类之间的继承,这这些继承的关系是否可以同时映射到数据库呢?

1. ODB中的继承类型

ODB支持2中继承类型,abstract和polymorphic。根据ODB文档的描述,abstract方式为复用继承。而polymorphic是属于虚拟继承(支持C++的动态联编).

我们知道,要把一个C++类定义为数据库对象,需要使用#pragma db object 指令告诉ODB编译器。而abstract和polymorphic都是object的一种模式,因此需要使用指令#pragma db object abstract 或者#pragma db object polymorphic指令来通知编译器,基类的继承模型。

abstract和polymorphic在同一个基类中是不能共存的,要不选择abstract要不就选择polymorphic。

2. abstract和polymorphic的区别

从数据库的表现来看,abstract对应的object类,ODB没有为其生成对应的表格,很惊讶吧,不是说每个object类都至少会映射一个表格吗?怎么abstract object没有呢?因为派生类仅仅是把abstract 类的字段合并到自己的表格中而已,有点很想C++的POD类型,仅仅是内存布局上合并在一起,只不过在这里是合并在同一个表格上。

另外abstract object不能有 标记为id属性的字段。因为他不是一个数据库持久对象。也不能使用load、persist、update、find、erase等数据库方法直接操作abstract object类对象。

polymorphic的行为和C++的动态类型几乎是一样的。ODB会为polymorphic的基类生成一个独立的表格,里面会包含子类的类型信息。polymorphic可以有id属性,整个继承体系的id在相同的线性空间上,也就是不同派生类的对象的id不能相同。在load、find的时候,会根据数据库表格里面存储的类类型自动创建正确的子类。在persist、update、erase的时候,也可以直接只用polymorphic的基类调用即可,ODB生成的代码会自动的去识别子类的类型,并调用相应的trait类。

3.polymorphic表格

ODB文档描述:polymorphic的表格有三种方式分别为table-per-hierarchy, table-per-difference, and table-per-class

table-per-hierarchy: 就是每个polymorphic类及其派生类共用一个表格。大表,对于不相关的字段赋值为NULL。

table-per-difference: 就是polymorphic基类有一个表格,让后每个派生类也有自己的一个表格,派生类的表格只保存与自己像个的字段,不保存基类的字段。但是这样有个问题,就是在load对象的时候需要使用联合查询或者2次查询。在update,persist的时候需要2或者多条SQL语句。(推荐使用、数据库没有太多的冗余字段)

table-per-class: 每个派生类一个表格,并且把基类的信息一起合并在一起。和abstract的派生类的表格类似。

4.早期版本如何实现polymorphic

polymorphic特性实在ODB1.8版本才引入的。早期1.4,1.5版本只支持abstract模式。这个时候ODB自己不支持动态类型,需要自己额外添加一个关联映射对象,除了类名称,字段和abstract类一模一样,并且自己增加类型信息字段。在dbevent的persist、erase事件的时候,同步操作关联类,相对比较麻烦。

5.实例

使用入门(一)的数据模型;

加上数据库id为1的类型为一个Zone类。那么一下2中方式都可以正确的从数据库加载Zone的信息.

shared_ptr<Zone>  z = db.load<Zone>(1);

shared_ptr<Entity> e = db.load<Entity>(1);

persist时, shared_ptr<Zone> z( new Zone()) 或者 shared_ptr<Entity>(new Zone());都可以直接调用db.persist(z). update、erase与persist相同。

不能在abstract类上调用persist\update\erase等操作.

分享到: 0赞
声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。

C++ ORM ODB 入门介绍(二)的更多相关文章

  1. C++ ORM ODB 入门介绍(一)

    C++的语言特性决定了在C++中的ORM框架不可能像Java,C#那没有那么灵活. C++的ORM框架一般都是基于模板,编译时,因此其效率比起Java中的ORM框架更高. ODB是一个比较独立,成熟的 ...

  2. JavaScript入门介绍(二)

    JavaScript入门介绍 [函数] 函数function 是Javascript的基础模块单元,用于代码的复用.信息影藏和组合调用. function a(){} 函数对象Function Lit ...

  3. mybatis入门介绍二

    相信看过我的上一篇博客的同学都已经对mybatis有一个初步的认识了.这篇博客主要是对mybatis的mapper代理做一下简单的介绍,希望能够帮助大家共同学习. 我的上一篇博客:mybatis入门介 ...

  4. C++ ORM ODB 入门(三)

    本节介绍ODB的事务与 异常. 数据库操作经常涉及到操作多个表格,或者表格中的多行数据.因此必须保证整个过程是原子性的.ODB为数据库的事务提供了易于使用的接口. 使用odb::databse的相关方 ...

  5. C++ ORM ODB入门

    1.ORM ORM, Object Relational Mapping, 对象关系映射,用来将基于对象的数据结构映射到SQL的数据结构中.即将基于对象的数据映射到关系表中的字段,然后我们可以通过对象 ...

  6. mybatis入门介绍一

    首先介绍一下Mybatis是什么?mybatis是Java的持久层框架, JAVA操作数据库是通过jdbc来操作的,而mybatis是对jdbc的封装. 使用mybatis之后,开发者只需要关注sql ...

  7. Azure Cosmos DB (一) 入门介绍

    一,引言 今天是国庆.中秋双节房价的第三天,今天抽时间分享一篇关于使用Azure 提供的一项NoSql 服务-----Azure Cosmos DB.就有人问了,我听说过 MongoDB.Redis ...

  8. Redis(二):Redis入门介绍

    Redis入门介绍目录导航: 入门概述 VMWare + VMTools千里之行始于足下 Redis的安装 Redis启动后杂项基础知识讲解 入门概述 是什么 Redis:REmote DIction ...

  9. 网络流量预测入门(二)之LSTM介绍

    目录 网络流量预测入门(二)之LSTM介绍 LSTM简介 Simple RNN的弊端 LSTM的结构 细胞状态(Cell State) 门(Gate) 遗忘门(Forget Gate) 输入门(Inp ...

随机推荐

  1. ANDROID_MARS学习笔记_S01原始版_012_广播机制一

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  2. java.lang.Boolean为null时

    public class TestBooleanNull { public static void main(String[] args) { if (test()) { System.out.pri ...

  3. 在Hadoop伪分布式模式下安装Hbase

    安装环境:Hadoop 1.2.0, Java 1.7.0_21 1.下载/解压 在hbase官网上选择自己要下的hbase版本,我选择的是hbase-0.94.8. 下载后解压到/usr/local ...

  4. Python sh库学习 上篇

    官方文档有句话"allows you to call any program",并且:helps you write shell scripts in Python by givi ...

  5. 使用Xcode查找项目中的中文字符串

    打开”Find Navigator” 切换搜索模式到 “Find > Regular Expression” 输入@"[^"]*[\u4E00-\u9FA5]+[^" ...

  6. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页Portal界面拖拽(Ⅵ)

    上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 构建Web界面>,主要介绍系统界面布局.导出数据等. 本篇将介绍首页Portal界面拖拽. 一.首页Portal界面拖拽 ...

  7. 高并发的常见策略--大型web项目

    一个运营的系统在正式上线后将会遇到各种层级的高并发请求,因此我们必须对此做出相应的策略和技术解决方案,首先我们需要认清系统的高并发由3个层面导致: 1. 传输层 大量用户对系统请求后,将会造成网络带宽 ...

  8. uDig介绍

    一 安装配置Java平台此步骤不必多说,如果您是Java开发者可以跳过.如果您的机器上没有Java平台,那么请到http://java.sun.com下载jdk,当下最新的版本是1.6.安装jdk,请 ...

  9. LA4329 Ping pong 树状数组

    题意:一条大街上住着n个乒乓球爱好者,经常组织比赛切磋技术.每个人都有一个能力值a[i].每场比赛需要三个人:两名选手,一名裁判.他们有个奇怪的约定,裁判必须住在两名选手之间,而裁判的能力值也必须在两 ...

  10. 一个free的问题

    请看下面的代码: #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sy ...