java类存储在数据库中的哪个位置?

时间:2015-10-09 08:29:10

标签: java sql inheritance orm

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

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

但并非一切都清楚。问题是:

1)类存储在数据库中的哪个位置,以及存储类的实例在哪里?

2)比方说,class B延伸class A。如何让b的实例B明白它是派生的A?如何让b了解这是class B的实例,而不是class A

3)是否存在向继承层次结构添加新类不需要更改表结构的模式?

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

UPD:可能我表达的想法不够清楚。假设它不是java,而是任何其他语言。这种静止是在数据库结构的背景下。是否存在允许多重继承的模式(如上所述)?

感谢。

2 个答案:

答案 0 :(得分:2)

  

1)类存储在数据库中的哪个位置,以及存储类的实例在哪里?

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

  

2)比方说,B类扩展了A类。如何使B的实例b明白它是派生的A?如何让b明白这是B类的实例,而不是A类?

这通常通过鉴别器列完成。

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

  

3)是否存在向继承层次结构添加新类不需要更改表结构的模式?

这可以通过每个表或加入策略来实现。在这两种情况下,您都需要为新的子类添加表,但您不必更改现有的子表(前提是您已经有一个鉴别器列,否则您必须添加一次)

  

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

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

答案 1 :(得分:0)

1)我不知道

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

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

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

4)你不能使用更多的继承。但是你可以实现更多的接口。也许这就是你的方式。否则,您必须使用更多类的继承。所以你得到了子,子,子类或其他东西。