2017-05-24 2 views
0

Ich möchte sicherstellen, dass ich verstehe, was ich in meiner DB-Darstellung & mit Hibernate mache.Foreign Key Einschränkung für eine @ OneToMany-Beziehung

Mit meinem Projektmanagement-Tool kann mein Benutzer ein Project erstellen, das aus Phase (s) besteht.

Ich möchte nicht über eine Verknüpfungstabelle erstellen und haben wie solche in meinen Einheiten fort:

Mein ProjectEntity:

@OneToMany(mappedBy = "id") 
private Set<PhaseEntity> phases = new HashSet<>(0); 

und meine PhaseEntity:

@NotNull 
@ManyToOne(targetEntity = ProjectEntity.class) 
private ProjectEntity project; 

Nach dem Befüllen meine PhaseEntity und speichern sie über meine DAO

phaseDao.save(phaseEntity);

bekomme ich folgende Fehlermeldung:

ERROR: insert or update on table "phase" violates foreign key constraint "fk8x1x98c4hq4ps0d30y6nxe90u" Detail: Key (phase_id)=(1820) is not present in table "project".

So wie ich es sehe, drückt eine Phase ein bestimmtes ProjectEntity zu meiner Datenbank enthält, sollte einen Eintrag erstellen und ein anderes zu aktualisieren, sollte die erste meine sein phase Eintrag, und die letztere sollte ein Update auf eine project durch Hinzufügen einer Phase zu seiner Set sein.

Muss ich meine Phase explizit in meiner project Tabelle speichern? Sehen Sie irgendwelche Fehler in meiner Argumentation?

Antwort

0

Teilen Sie einfach das Wissen!

"Ein Projekt, das aus Phasen besteht" Wenn Sie also eine Phase in die "Phase" -Tabelle einfügen möchten, müssen Sie eine Rolle in der Projekttabelle haben, die den gleichen 'Klassen' Spaltenwert hat als "Klassen" -Spaltenwert der neu eingefügten Zeile in der Phase-Tabelle.

Ein Fremdschlüssel ist eine Spalte (oder Spalten), die auf eine Spalte (meist der Primärschlüssel) einer anderen Tabelle verweist. Der Zweck des Fremdschlüssels besteht darin, die referentielle Integrität der Daten sicherzustellen. Mit anderen Worten, nur Werte, die in der Datenbank erscheinen sollen, sind erlaubt.

Wir haben zwei Tabellen, eine Projekttabelle, die alle Projekte enthält, und eine Phasentabelle, die alle Phasen enthält. Ein Projekt, das aus Phasen besteht. Um diese Logik zu erzwingen, platzieren wir einen Fremdschlüssel in der Phase-Tabelle und verweisen ihn auf den Primärschlüssel der Projekttabelle. Auf diese Weise können wir sicherstellen, dass alle Phasen in der Phasentabelle mit einem Projekt in der Phasentabelle verknüpft sind. Mit anderen Worten, die Phasentabelle kann keine Informationen zu einem Projekt enthalten, das nicht in der Projekttabelle enthalten ist.

Verwandte Themen