2015-10-09 33 views
0

我需要建議反映類的對象模型的數據庫結構的三種變體。數據庫的結構應該允許 理解類繼承。 爲簡單起見,類僅包含屬性(無方法)。Java類在數據庫中存儲在哪裏?

我認爲單表繼承,類表繼承,具體表繼承模式。

但並非所有事情都清楚。問題是:

1)哪裏有類存儲在數據庫中,哪裏存儲類的實例?

2)比方說,class B延伸class A。如何使B的實例b明白它是派生的A?如何使b瞭解這是class B的一個實例,而不是class A

3)是否有一個模式,在繼承層次結構中增加一個新類不需要改變表的結構?

4)有沒有允許多重繼承的模式?

UPD:大概我表達了我的想法不夠清楚。假設它不是Java,而是任何其他語言。這個quiesion是在數據庫結構的情況下。是否有模式(如上圖),允許多重繼承?

謝謝。

回答

2

1)哪裏有類存儲在數據庫中,哪裏存儲類的實例?

類不存儲在數據庫中,只存在實例。在大多數情況/映射器中,鑑別器告訴映射器實例的類型/類。

2)假設,B類擴展了A類。如何讓B的B實例明白它是一個派生的A?如何讓B理解這是B類的一個實例,而不是A類的實例?

再次,這通常通過鑑別器列完成。

至於「如何使B的實例b明白它是派生的A」:你在代碼中這樣做,即B extends A。如果更改了以後你可能會破壞現有的數據,所以你要麼需要設計模型時,考慮繼承或有一定的遷移策略,當你需要做出改變。

3)是否有一個模式,其中繼承層次結構的新類不需要改變表的結構?

這可以通過按班級或加入策略來實現。在這兩種情況下,你需要添加表爲新的子類,但你不必改變現有的(前提是你已經有了一個鑑別列,否則你就必須添加一次)。

4)是否有一個行話,它允許多重繼承?

不,Java不允許多繼承(這也適用於orm),並且在大多數情況下不需要它。改爲嘗試組合。

+0

1)但是,當我從理解[這裏](http://stackoverflow.com/questions/657803/where-are-java-classes-stored-in-oracle),有存儲Java字節代碼和源的表。你能否談談這點?我不明白。 4)在數據庫(不是java)的情況下,如果使用多重繼承,我應該使用多個鑑別器列嗎? –

+0

@ a.yuzhanin您發佈1鏈路)指的是Oracle數據庫,並從閱讀它,它是不是真的清楚什麼是字節碼和源的用途。這可能是某種類型的存儲過程等,但它肯定不適用於一般的ORM等,至於2):你可能仍然有一個鑑別,因爲它描述了一個行應該映射到的類。繼承信息通常存儲在代碼本身中。除此之外,多重繼承往往不是最明智的方法(這就是Java不支持它的原因)。 – Thomas

0

1)我不知道

2)在if語句,你可以問,如果是像這樣一個對象的實例:

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

3)這是可能的,當類不是'抽象的'。當沒有抽象方法時。

4)你不能再使用更多的繼承。但是你可以實現更多的接口。也許這是你的方式。否則,你必須使用更多類的繼承。所以你得到一個分,子,課堂或其他東西。