A polymorphic association類似於外鍵或多對一關係,區別在於目標可能是多種類型之一(語言中的類,db中的表)。如何在JPA中表示多態關聯?
我正在移植一個數據庫設計,我從PHP到Java已經使用了好幾年了。在舊代碼中,我推出了自己的ORM,由於多種原因,這並不是最優的。雖然我可能會稍後開始調整,也許最終會再次自己實現,因爲現在我想在實體類中使用現成的ORM和JPA。
現在,有一件事是關於數據庫的佈局,我不知道如何在JPA表示:
我有一個Node
和Edge
表中存儲一個圖(DAG後,如果它事項)。每個節點可以選擇引用數據庫中的另一個實體。這些實體可能在整個圖表中被多次引用,並且也可能存在「孤兒」實體,這對用戶來說是不可訪問的,但是可能有意義的是保持至少一段時間。
這些對象在繼承等方面並不完全相關,但具有自然層次結構,類似於Customer-> Site-> Floor-> Room。事實上,多年前,我剛開始時只使用了指向「父」對象的外鍵字段。但是,這種層次結構不夠靈活,並開始分崩離析。
例如,我想允許用戶對文件夾中的對象進行分組,一些對象可以有多個「父母」,並且關係隨時間而改變。我需要跟蹤關係是如何的,因此圖的edegs有一個與它們相關的時間跨度,從何時到何時該邊是有效的。
從節點到對象的鏈接存儲在節點表的兩列中,一個攜帶外部表中的id,一個攜帶它的名稱。例如(某些列省略):
table Node:
+--------+-------+----------+
| ixNode | ixRef | sRefType |
+--------+-------+----------+
| 1 | NULL | NULL | <-- this is what a "folder" would look like
| 2 | 17 | Source |
| 3 | 58 | Series | <-- there's seven types of related objects so far
+--------+-------+----------+
table Source (excerpt):
+----------+--------------------+
| ixSource | sName |
+----------+--------------------+
| 16 | 4th floor breaker |
| 17 | 5th floor breaker |
| 18 | 6th floor breaker |
+----------+--------------------+
可能有與使用JPA不同的解決方案。我可以改變一些關於表格佈局或者引入一個新表格等等。然而,我已經想到了很多,表格結構對我來說似乎還可以。也許還有第三種方式,我沒有想到。
對不起,但那對我不起作用。表格中有更多的信息,還有更多的表格,這些例子被簡化了。有很多種類型的對象,我需要一個圖表來更靈活地表達它們之間的關係。 – 2009-06-29 07:43:36
也許,我可以想象某種抽象的RelatedEntity和一個存儲鍵值對的泛型屬性表,但這似乎有點過分了。我幾乎沒有db中的結構化信息了。 – 2009-06-29 08:23:21