- 使用
- 将若干相似的类映射为单表,对拥有许多特殊数据的类使用具体表继承.
- 对高层次使用类表继承,对低层次使用具体表继承.
- Single Table Inheritance
- 在DB中将类继承层次设计为一个单表,表中各列代表不同类中的所有域.
- 运行机制
- 每个类负责把与之相关的数据保存在表的一行中.表中其它不相关的列留空.
- 通过表中的Type字段来决定向内存中加载对象时,应该实例化那个类来创建该对象.
- 可以直接使用类名称
- 或者需要经过翻译的Code域.
- 保存数据的代码可以由层超类负责.
- 使用时机
- 优点
- 只需要关注一个DB表.
- 获取数据时不必进行连接.
- 对继承层次的重构(在父子之间挪动某个域)不需要修改DB.
- 缺点
- DB表的列和对象的域不是一一对应的.
- 空间的浪费.
- 可能太大的单表.过多的索引被频繁上锁.导致访问效率低下.
- 域名称可能重复(加上类名做区分可以解决).
- 优点
- Class Table Inheritance
- 每个DB来代表一个类.
- 运行机制
- 类中的域直接映射到相应表中的字段上.
- 表的行链接问题
- 使用公用的主键.由于超类表针对其它子类表中的每一行都有对应的一行.所以主键必须在各表间唯一.
- 每个表都有自己的主键,并使用超类表的外键把各行联系在一起.
- 最大的问题是如何有效地把数据从多个表中取回.
- 对每个表都进行一次调用会造成多次调用.
- 一次链接来处理多个表,会在表数目较大时,产生性能问题.
- 通常,对于指定的查询,并不清楚具体需要链接那些表.如查询一组运动员.
- 使用外链接来在某些表没有数据时有效地进行链接.
- 先读根表,然后找出下一个该读取的表.但是这样会有多次查询.
- 使用时机
- 优点
- DB表更容易理解,且没有空间浪费.
- 领域模型和DB之间的关系简单明了.
- 缺陷
- 加载一个对象需要访问多个表(也就是需要链接)
- 字段在继承层次中上下移动会导致DB重构.
- 对超类的频繁访问会导致瓶颈.
- 优点
- Concrete Table Inheritance
- 内存中的每一个具体类对应一个DB表.
- 运行机制
- Db表中的列包含着具体类和其所有祖先类中的所有域.超类中的所有域在子类的DB表中都会被复制.
- 需要保证键在继承层次中所有的表键都是唯一的.
- 需要一个键分配系统来记录表间键的使用情况.
- 要么避免使用超类的域,要么使用包含表ID的复合键.
- 引用完整性问题
- 例如,慈善活动和Player的关联.由于没有Player对应的Db表.所以无法使用外键来构建链接表.
- 此时,可以忽略引用完整性.
- 或者,使用多链接表.DB中的每个表都有一个链接表与之对应.
- 使用时机
- 优点
- 每个DB表都是自包含的,并且不含有不相关的域.
- 具体映射器读取数据时不需要链接操作.
- 只有在类被访问时,对应的DB表才会被访问.分散了访问负载.
- 缺陷
- 主键很难处理.
- 不能把数据库关系加到抽象类中.
- 域在继承树上移动时,须更改表定义.
- 超类的域改变时,会有很多的子类DB表连带更改.
- 超类上的一次查找需要检查所有表.
- Inheritance Mapper
- 运行机制
- 查找方法定义在具体子类上,因为它要返回一个具体类.OO不允许改变已声明方法的返回值类型.
- 基本行为:在DB中找到合适的行,实例化正确类型的对象(子类决定),并用来自DB的数据来加载对象.
- 子类映射器在加载子类特有的数据后,一直向上调用它的超类方法.
- 插入和更新
- 都使用保存方法.可以在超类上定义接口.
- 插入:创建一个新行,将对象中的数据用Save钩子方法保存起来.
- 更新:值保存数据,也使用Save钩子方法.
- 与加载类似,每个类保存其特有的数据,之后调用超类的保存方法.
- 一个支持保存和加载的抽象类
- Abstract Player映射器负责向DB中加载和保存特定的Player数据.
- 它是一个抽象类.其行为只有具体的映射器子类使用.
- 独立的Player映射器.
- 提供了操作的接口.
- 提供了查找方法.
- 覆盖了插入和更新方法.
- 其只负责找到应该处理某个具体任务的具体映射器,并把任务委托给该具体映射器.
- Abstract Player映射器负责向DB中加载和保存特定的Player数据.
- 查找方法定义在具体子类上,因为它要返回一个具体类.OO不允许改变已声明方法的返回值类型.
- 运行机制
相关文章
- TSL 和 SSL 是什么?它们有何关系?-定义:SSL(安全套接层)是一种早期的加密协议,用于在互联网通信中保障数据传输的安全性。它通过加密和身份验证机制,确保客户端(如浏览器)与服务器之间的通信不被窃听或篡改。 版本:SSL 1.0(未发布)、SSL 2.0(1995年,已废弃)、SSL 3.0(1996年,已淘汰)。 问题:SSL 3.0 及早期版本存在严重安全漏洞(如 POODLE 攻击),目前已被现代系统禁用。 2. TLS(Transport Layer Security) 定义:TLS(传输层安全协议)是 SSL 的继任者,旨在提供更安全的通信协议。TLS 由国际互联网工程任务组(IETF)标准化,逐步替代了 SSL。 版本:TLS 1.0(1999年,已淘汰)、TLS 1.1(2006年,已淘汰)、TLS 1.2(2008年,广泛使用)、TLS 1.3(2018年,最新标准)。 优势:更强的加密算法(如 AES、ChaCha20)、更高效的握手过程、支持前向保密(Perfect Forward Secrecy)等。 SSL 与 TLS 的关系 继承关系 TLS 直接基于 SSL 3.0 设计,可以视为 SSL 的升级版。TLS 1.0 最初命名为 SSL 3.1,后因标准化需要更名为 TLS。 协议兼容性
- 技术对比着学-java中abstract,public,protected,private以及不写作用域的时候在继承关系中的调用
- hibernate在配置文件中配置对象关系映射文件即hbm文件路径的写法
- java中的集合:继承关系和简介
- UI 和粒子层级关系问题,粒子在UI中显示超出的部分不显示
- Java 数据结构-特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。 实现类: LinkedList, PriorityQueue, ArrayDeque。 堆(Heap) 堆(Heap)优先队列的基础,可以实现最大堆和最小堆。 PriorityQueue<Integer minHeap = new PriorityQueue<>; PriorityQueue<Integer maxHeap = new PriorityQueue<>(Collections.reverseOrder); 树(Trees) Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 图(Graphs) 图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。 以上介绍的只是 Java 中一些常见的数据结构,实际上还有很多其他的数据结构和算法可以根据具体问题选择使用。 其他一些说明 以下这些类是传统遗留的,在 Java2 中引入了一种新的框架-集合框架(Collection),我们后面再讨论。 枚举(Enumeration) 枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。 例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。 关于枚举接口的更多信息,请参见枚举(Enumeration)。 位集合(BitSet) 位集合类实现了一组可以单独设置和清除的位或标志。 该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。 关于该类的更多信息,请参见位集合(BitSet)。 向量(Vector) 向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。 和数组一样,Vector对象的元素也能通过索引访问。 使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。 关于该类的更多信息,请参见向量(Vector) 栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构。 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。 当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。 关于该类的更多信息,请参见栈(Stack)。 字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用 Dictionary。 由于 Dictionary 类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现。 关于该类的更多信息,请参见字典( Dictionary)。 Dictionary 类在较新的 Java 版本中已经被弃用(deprecated),推荐使用 Map 接口及其实现类,如 HashMap、TreeMap 等,来代替 Dictionary。
- java中的集合:继承关系和简介
- 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(
- centos下如何像windows在hosts文件中设置域名和ip的对应关系
- python在window中显示内存对象关系图objgraph出错的应对办法