Wie setze ich eine polymorphe Assoziation in JPA?

Einen polymorphic association ist ähnlich wie eine foreign key-oder viele-zu-eins-Beziehung, mit dem Unterschied, dass das Ziel könnte sein, eine von einer Reihe von Typen (Klassen, die in der Sprache, in den Tabellen in der db).

Ich bin portieren einer Datenbank-design, ich nutze seit einigen Jahren von PHP nach Java. In den alten code, den ich gerollt hatte meine eigenen ORM, die nicht optimal für eine Reihe von Gründen. Obwohl ich könnte anfangen zu zwicken, Dinge später, und vielleicht am Ende der Umsetzung alles selbst wieder, jetzt würde ich gerne eine off-the-shelf-ORM und JPA auf meinem entity-Klassen.

Nun, es ist eine Sache, über die Datenbank-layout, dass ich nicht weiß, wie zu sagen, JPA:

Ich habe eine Node und ein Edge Tabelle speichern einer graph (DAG, wenn es darauf ankommt). Jeder Knoten kann Optional auf eine andere Entität aus der Datenbank. Diese entites werden kann refrenced mehrere Male in der Grafik und es kann auch "verwaiste" entites, die sonst nicht zugänglich für die Nutzer, aber was Sinn machen würde, zu halten, zumindest für eine Weile.

Diese Objekte sind überhaupt nicht im Zusammenhang in Bezug auf die Vererbung etc. aber haben eine Natürliche Hierarchie, ähnlich wie Kunden->Seite->Boden->Zimmer. In der Tat, vor Jahren, angefangen habe ich nur mit foreign-key-Felder verweisen auf den "parent" - Objekte. Aber diese Hierarchie ist nicht flexibel genug und begann, auseinanderzufallen.

Ich beispielsweise zulassen möchten, dass Benutzer zu der Gruppe von Objekten in Ordnern, einige Objekte können mehrere "Eltern" und auch die Beziehungen im Laufe der Zeit ändern. Ich brauche zu verfolgen, wie die Beziehungen verwendet werden, so dass die edegs des Graphen haben eine Zeitspanne mit Ihnen verbunden, dass Staaten, von Wann bis Wann, der Rand war gültig.

Den link von einem Knoten zu einem Objekt gespeichert ist, in zwei Spalten die Knoten-Tabelle, trägt man die id in der fremden Tabelle, einer trägt seinen Namen. Zum Beispiel (einige Spalten weggelassen):

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  |
+----------+--------------------+

Gibt es möglicherweise eine andere Lösung als die Verwendung von JPA. Ich könnte etwas über das Tisch-layout oder die Einführung einer neuen Tisch etc. Allerdings habe ich viel darüber nachgedacht und schon die Struktur der Tabelle scheint OK zu mir. Vielleicht gibt es auch noch einen Dritten Weg, dass ich daran nicht gedacht.

InformationsquelleAutor Hanno Fietz | 2009-06-26
Schreibe einen Kommentar