繁体   English   中英

Java类存储在数据库中的什么位置?

[英]Where are java classes stored in database?

我需要建议数据库结构的三种变体,以反映类的对象模型。 数据库的结构应允许了解类继承。 为简单起见,类仅包含属性(不包含方法)。

我考虑了单表继承,类表继承,具体表继承模式。

但是并不是所有事情对我来说都是清楚的。 问题是:

1)类存储在数据库中的什么地方,类的实例存储在哪里?

2)假设class B class A扩展了class A 如何使B实例b了解它是派生的A 如何使b理解这是class B class A的实例,而不是class A class B的实例?

3)是否有一种模式,其中在继承层次结构中添加新类不需要更改表的结构?

4)是否有允许多重继承的模式?

UPD:可能我表达的想法不够清楚。 假设它不是Java,而是任何其他语言。 该问题与数据库结构有关。 是否存在允许多重继承的模式(如上)?

谢谢。

1)类存储在数据库中的什么地方,类的实例存储在哪里?

类不存储在数据库中,仅存储在实例中。 在大多数情况下,鉴别器会告诉映射器实例的类型/类。

2)假设类B扩展了类A。如何使B的实例b了解它是派生的A? 如何使b理解这是B类而不是A类的实例?

同样,这通常是通过区分符列完成的。

至于“如何使B的实例b理解它是派生的A”:您可以在代码中做到这一点,即B extends A 如果以后进行更改,则可能会破坏现有数据,因此在设计模型时需要考虑继承,或者在进行更改时需要一些迁移策略。

3)是否有一种模式,其中在继承层次结构中添加新类不需要更改表的结构?

这可以通过按班级分配表或联合策略来实现。 在这两种情况下,都需要为新的子类添加表,但不必更改现有的子类(前提是您已经有一个discriminator列,否则必须添加一次)。

4)是否有允许多重继承的模式?

不,Java不允许多重继承(这也适用于orm),而且在大多数情况下都不需要。 尝试合成。

1)我不知道

2)在if语句中,您可以询问它是否是和这样的对象实例:

if ( obj instanceof A ) {
    obj.method1();
} else {
    obj.method2();
}

3)当班级不是“抽象”时,这是可能的。 并且当没有抽象方法时。

4)您不能再使用一个继承。 但是您可以实现更多的接口之一。 也许这就是您的方式。 否则,您必须使用更多类的继承。 这样就得到了子类,子类,子类之类的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM