zoukankan      html  css  js  c++  java
  • C++ ORM ODB 入门介绍(二)

    目录[-]

    本节主要介绍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类上调用persistupdateerase等操作.

    分享到: 0
    声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。
  • 相关阅读:
    [03] html 中引入与使用css
    [04] 前端构建工具区别
    [04]测试框架杂谈
    [03] react 测试
    [02] 前端测试工具集锦
    [01]关于TDD、BDD和DDD的一些看法
    [04]JS获取文件大小方法
    [03]使用阿里RAP搭建前端Mock Server
    [1]区分event对象中的[clientX,offsetX,screenX,pageX]
    [02]a tag只为成button用时候设置href的办法
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4013238.html
Copyright © 2011-2022 走看看