Entities mit Vererbung

DaBe1812

Bekanntes Mitglied
Hi,

ich habe in meinem Projekt mehrere verschiedene Entitäten:
Rackserver
Bladeserver
Enclosure

Diese teilen sich ein paar Felder und in manchen Dingen sind sie eben einzigartig.
Also hatte ich mir eine Hirarchie überlegt um die Felder nicht mehrfach definieren zu müssen.

Ganz oben Hardwareserver
Von Hardwareserver erben Enclosure und BladeRackServer
Und von BladeRackServer erben Bladeserver und Rackserver

Die Entity Annotation ist nur in den untersten Klassen
Ich hab die automatische Generierung von DDL eingeschaltet, weil es mir einfach zu viele Entitäten insgesamt sind und ich später, wenn Spalten dazu kommen nicht immer selbst darauf achten möchte, dass diese auch in jedem Stage hinzugefügt worden sind.

Wenn er allerdings mit dem generieren fertig ist, dann sind in Rackserver und Enclosure nur die Felder, die direkt in der Klasse sind und in Bladeserver ist zusätzlich noch ein Feld DTYPE VARCHAR(31) von dem ich nicht weiß, wo es her kommt.

Ist das mit Vererbung bei Entitäten komplizierter, oder ganz unmöglich?
 

KonradN

Super-Moderator
Mitarbeiter
Was nutzt Du denn in Deinem Projekt für eine Technologie / Library?

Hibernate will z.B. ein @MappedSuperclass - siehe z.B. https://www.baeldung.com/hibernate-inheritance

Spring data JPA hat ein @Inheritance - siehe z.B. https://www.spring-boot.io/blog/jpa-inheritance

Daher wäre wirklich die Frage: Was nutzt Du genau? Und da kann man dann auch suchen in der Suchmaschine Deiner wahl: Technologie entity inheritance, also obrige Links bekam ich per "Hibernate Entity inheritance" bzw. "Spring data java entity inheritance" Suchen und herauspicken eines der ersten Treffer.
 

DaBe1812

Bekanntes Mitglied
Hi,
ich benutze EclipseLink, das ist hier Vorgabe, Spring funktioniert nicht richtig in deren Serverumfeld.
Du weißt doch, wie das mit der Suchmaschine ist: wenn du nicht weißt, wie das heißt, was du suchst, dann findest du nur Blödsinn. Inheritance wäre so etwas gewesen, was man hätte wissen müssen.

Ich berichte, wie fündig ich gewordene bin.

Aber noch eine Suche, bei der ich nicht weiß, wonach ich eigentlich suche:
Ich habe in dem Projekt eine Entität Server.
Die ist nur recht klein und dient eigentlich nur der Zuordnung.
Davon Abhängig habe ich 4 weitere Entitäten, die drei oben: Bladeserver, Rackserver, Enclosure und zusätzlich noch VirtuelleServer.
Der Einfachheit halber hätte ich gerne dass die Primärschlüssel gleich sind.
Also ein Server hat einen kombinierten Primärschlüssel aus UUID und TimeStamp und dieser Server soll in der Klasse Quasi der Primärschlüssel sein.

Ich weiß nichtmal, wie man das nennt oder nennen soll.
 

Oneixee5

Top Contributor
Also ein Server hat einen kombinierten Primärschlüssel aus UUID und TimeStamp und dieser Server soll in der Klasse Quasi der Primärschlüssel sein.
Man kann zwar solche kombinierten Primärschlüssel(PK) verwenden aber ich rate davon ab. Wir machen das nicht mehr. Wir verwenden in solchen Fällen einen generierten PK und einen Unique-Key(-Index). Also einen technischen PK und einen fachlichen PK. Den Timestamp in einen PK aufzunehmen ist aber eher fragwürdig und bringt nichts. Das wirkt am Ende wie kein PK. Timestamp geht am Ende bis yyyy-mm-dd hh:mm:ss.nnnnnn, bei so großer Genaugkeit gibt es praktisch keine doppelte Zeit.
 

DaBe1812

Bekanntes Mitglied
Man kann zwar solche kombinierten Primärschlüssel(PK) verwenden aber ich rate davon ab. Wir machen das nicht mehr. Wir verwenden in solchen Fällen einen generierten PK und einen Unique-Key(-Index). Also einen technischen PK und einen fachlichen PK. Den Timestamp in einen PK aufzunehmen ist aber eher fragwürdig und bringt nichts. Das wirkt am Ende wie kein PK. Timestamp geht am Ende bis yyyy-mm-dd hh:mm:ss.nnnnnn, bei so großer Genaugkeit gibt es praktisch keine doppelte Zeit.
Hi, ich bin auch kein Freund von kombinierten PKs, aber mir fällt einfach keine sinnvolle Alternative für den Usecase ein:
Du hast ein logisches System mit Attributen, wie zugewiesener Speicher, zugewiesener RAM,...
Dieses hat einen Lebenszyklus, also irgendwann wurde es geplant, dann wurde es produktiv genommen, mehrfach Speicher und RAM geändert und zuletzt wurde es abgebaut.
Diese ganzen Schritte sind das, was unsere Anwendung aus macht, also User möchten gerne nach dem System in seiner aktuellen Version suchen können, aber auch nach allen Vorgängerversionen. Das nur als Erklärung, warum ich alte Versionen nicht in einer History-Tabelle führe.
Also bekomme ich über den PK alle Versionen des Systems und der Timestamp unterscheidet, seit wann eine Version gültig ist.
Das ist eine Entität, und wenn es nur die eine wäre, wäre ich total bei dir mit dem internen PK und dem fachlichen PK, aber
Dieses logische System liegt auf einem Server, der hat eingebauten Ram und Festplatten und einen Einbauort und solche Dinge, die sich ändern können, also hat er auch Zeitscheiben, wie das logische System.
Wenn ich jetzt den PK des Servers in das logische System eintrage, als es aufgebaut wurde, dann ist das nach 6 Monaten nicht mehr der PK des aktuell gültigen Servers, also dem Server auf dem das logische System noch liegt. Ich müsste also über den PK im logischen System den fachlichen PK des Servers suchen und prüfen, welche die aktuelle Version ist. Mit dem kombinierten PK muss ich einfach nur die aktuelle Version suchen, spare mir also einen Schritt.
Ich habe bisher keine bessere Lösung gefunden. Wenn du mir eine liefern kannst, wo ich Zeitscheiben habe und die Verknüpfung "schnell" ist, dann bitte sag sie mir, mir ist nichts eingefallen und glaub mir ich hätte nichts lieber weg, als die kombinierten PKs, weil die mag ich auch nicht.
 

DaBe1812

Bekanntes Mitglied
So, erstmal
Was nutzt Du denn in Deinem Projekt für eine Technologie / Library?

Hibernate will z.B. ein @MappedSuperclass - siehe z.B. https://www.baeldung.com/hibernate-inheritance

Spring data JPA hat ein @Inheritance - siehe z.B. https://www.spring-boot.io/blog/jpa-inheritance

Daher wäre wirklich die Frage: Was nutzt Du genau? Und da kann man dann auch suchen in der Suchmaschine Deiner wahl: Technologie entity inheritance, also obrige Links bekam ich per "Hibernate Entity inheritance" bzw. "Spring data java entity inheritance" Suchen und herauspicken eines der ersten Treffer.
Jupp es war @MappedSuperclass, damit hat er mir alles angelegt. In der persistence.xml musste auch nur das Child und nicht der gesamte Baum angegeben werden. Danke dafür.

Und die Composite Primary Keys war nicht das, was ich suche, das ist ja das, was ich aktuell schon nutze. Ich möchte quasi eine andere Entität als Primärschlüssel verwenden.
 

Oneixee5

Top Contributor
Ich denke jeder Server hat eine technische ID, sei es ein Name oder eine Nummer, etc. - damit hast du die Server-ID. Gerade virtuelle Server werden über Software verwaltet und dort wird diese ID ebenfalls verwendet. Um die Historie der Ausstattung zu dokumentieren kann man einfach eine Tabelle mit generiertem PK, einem FK zum Server und einer Period führen. Jetzt weiß ich nicht welche DB du verwendest aber die Period, also von-bis unter Oracle ist gleichzeitig ein Constraint, ein Index und immer valide. Die Suche/Abfrage ist ebenfalls sehr schnell. Ich sehe hier eigentlich gar kein Problem.
 

KonradN

Super-Moderator
Mitarbeiter
Evtl. mal kurz in eine "Meta-Ebene" weg vom technischen Problem - nur um sicher zu gehen, dass da nichts falsch verstanden wurde:
Du weißt doch, wie das mit der Suchmaschine ist: wenn du nicht weißt, wie das heißt, was du suchst, dann findest du nur Blödsinn.
Ja, das ist bekannt. Hier ist auch ganz wichtig: Ich mag mich evtl. manchmal blöd oder missverständlich ausdrücken, aber mir geht es bei so Antworten eigentlich immer um die Sache und nicht darum, irgend wen zu "maßregeln". Der Hinweis, wie ich gesucht habe, soll also Nichts aussagen wie "Mensch bist du blöd - kannst Du nicht einmal selbst suchen?" sondern nur rein eine Hilfestellung sein. Hier kannte ich die verwendete Technologie nicht und ggf. könnte man mit einer angepassten Suche dann hilfreiche Links finden.

Die beschriebene Problematik ist ansonsten mehr wie bekannt, denn das ist eine Situation, die wohl Jeder kennen wird. Daher auch garantiert keinerlei Intention, dich zu "Maßregeln" oder so.

Das einfach nur als kleine Sicherheit nur damit es nicht zu irgendwelchen unterschwelligen Konflikten kommt.
 

DaBe1812

Bekanntes Mitglied
@KonradN: mein Gott, das kam jetzt auch von mir falsch rüber. Ich bin dir unendlich dankbar und immer wieder froh, wenn jemand mir genau so hilft. Wenn man ein CDI-Problem hat, aber noch nie etwas von CDI gehört hat, dann wird man im Internet auch nicht nach CDI suchen und dann ist es reiner Zufall oder Glück, wenn ein Ergebnis mit CDI dabei ist. Deswegen war ich froh, dass du die beiden Schlagworte genannt hast und der erste Link hat auch direkt gelöst, was ich gesucht habe.

In Fachforen fühle ich mich erst angegriffen, wenn mich jemand direkt angreift. Mein Highlight bei einer Frage war, dass ich doch erstmal einen Programmierkurs machen soll, um weiter Fragen zu stellen. Dabei hat mir damals auch nur die richtige Richtung gefehlt, danach war alles ein Selbsläufer.

@Oneixee5 : Ob ich jetzt den Server anhand seiner Seriennummer, Bezeichnung, oder irgendeiner wild generierten Nummer identifiziere ändert ja erstmal nichts an meinem Problem und selbst wenn ich gewisse Felder auslagern würde, bliebe in der Auslagerungstabelle doch dasselbe Problem ich habe einen Pk, der mehrfach vorkommen kann und darin mehrere Zeitscheiben für Gültigkeiten.
Die Datenbank ist übrigens eine Oracle, hab aber die Version nicht mehr im Kopf, aber relativ aktuell.

Aktuell versuche ich mich an deiner ersten Idee, sauberer PK vorne, fachlichen Pk mit Gültigkeit intern. Aber das Verknüpfen tut glaube ich weh, da ich ja eigentlich als Fremdschlüssel einen Primärschlüssel aus der Fremdentität nehmen muss, oder kann ich auch ein anderes Feld nehmen?
 

LimDul

Top Contributor
Was @KonradN schreibt, gilt auch für mich. Ich werfe gerne auch mal nur sehr kurz Links in den Raum. Manchmal (aber das dann eher bei Fragen von Leuten, die ihre Hausaufgaben gemacht haben wollen) steckt da ein bisschen auch die Intention hinter "Bemüh dich mal selber".

Aber sehr oft ist es einfach, dass ich das während der Arbeit nebenbei mache und nicht die Zeit habe lange noch was zu schreiben. Und ich kenne das Problem. Wenn man nicht weiß wonach man Suchen muss, findet man nix. Da ist das dann wirklich wie hier gedacht als "Wenn ich dir den Einstiegspunkt gebe zum Thema, solltest du in der Lage sein von da aus dich selber zurecht zu finden"
 

DaBe1812

Bekanntes Mitglied
Also, ich denk mal laut weiter:
Ich habe ein logisches System mit Zeitscheiben, wie die jetzt aussehen ist egal, das hängt an einem Server mit einem einfachen PK in Form einer UUID. Dieser Server ist unveränderlich, sprich hat keine Zeitscheiben, alle Daten in dieser Entität sind fix. Dahinter habe ich Bladeserver, Rackserver, Enclosures und virtuelle Server. Die haben auch ein Server-Feld mit dem FK des Servers. Und hier habe ich wieder Zeitscheiben.
Aus Sicht des logischen Systems ist es egal, wie oft der Server sich ändert, weil der PK bleibt gleich und aus Sicht der "Serverdetails" gild dass genauso.
Dann würde auch die Methode funktionieren mit alle Sätze haben einen eindeutigen, einfachen PK und dann gibt es darunter den fachlichen PK und das Startdatum.
In einer Ansicht mit allen Versionen kann ich nach fachlichem PK gruppieren und bin von dem blöden kombinierten PK weg...

Spricht da noch etwas gegen?
 

Ähnliche Java Themen

Neue Themen


Oben