Mit Spring Boot starter versuche ich ein einfaches Beispielprojekt zu erstellen, das einen Benutzer mit mehreren Adressfeldern beinhaltet. Ich experimentiere mit @DiscriminatorColumn und @DiscriminatorValue, um die verschiedenen Arten von Adressen zu unterscheiden, die ein Benutzer haben kann.
Hier ist ein abgekürztes Beispiel der Tabellen in meinem Projekt:
%Vor%Und hier sind die Klassen, denen ich mich anschließen möchte:
%Vor% Ich habe versucht, @OneToOne
durch @OneToMany
zu ersetzen, aber es funktioniert immer noch nicht.
Der Grund, warum ich das tun möchte, ist, dass ich daran denke, eine Adresse mit anderen Entitäten zu verbinden. Zum Beispiel ShippingAddress für eine Bestellung oder LocationAddress für ein Gebäude usw.
Hier ist ein Dump des Fehlers:
%Vor%Leider können Sie keine separaten Beziehungen für die beiden Adresstypen erstellen, da reine JPA-Ergebnisse von Joins in Abfragen nicht 'diskriminieren' können, dh keine Joins mit dem Diskriminatorwert zum Abrufen nur von Objekten eines bestimmten Typs vornehmen für einen Verein und von einem anderen Typ für den anderen Verein. Hibernate verfügt stattdessen über Methoden, um dies zu tun, aber außerhalb der JPA-Spezifikation.
Es funktioniert also nur, wenn Sie eine @OneToMany
-Beziehung mit Address-Objekten haben, die Ihnen im Gegenzug eine polymorphe Sammlung mit
wiederum HomeAddress
und CurrentAddress
Objekte
Ich hatte ein ähnliches Problem. Die einzige Lösung für mich war, ein bisschen anders zu arbeiten (und grundsätzlich in einer Weise, die ich nicht so mochte, aber das ist es).
Grundsätzlich haben Sie 4 Optionen (und mehrere Alternativen):
1- mit nur einer ( @OneToMany
) Beziehung, scanne deine Sammlung nach Objekten vom Typ HomeAddress
und / oder CurrentAddress
nach dem Abrufen und ordne sie den richtigen Feldern zu.
2- Ändern Sie die Art, wie Ihre Vererbung gestaltet ist. In diesem Fall können Sie Adresse als @MappedSuperclass
und Ihre Unterklassen als Entitäten verwenden, die die Adressklasse erweitern. Die zwei Klassen sollten in zwei getrennten Tabellen zugeordnet werden. Sie benötigen keine Join-Tabelle.
So ging ich weiter, auch wenn es mir nicht besonders gefiel.
3- Werfen Sie die Vererbung weg und verwenden Sie 2 separate Tabellen
4 Verwenden Sie Winterschlafnotizen (nicht-jpa).
Es tut mir leid, dass ich keinen Code eingefügt habe, aber ich kann es hier nicht machen & amp; jetzt
Ihr Fehler ist:
verursacht durch: org.hibernate.boot.spi.InFlightMetadataCollector $ DuplicateSecondaryTableException: Tabelle mit diesem Namen [user_address] ist bereits mit entity
verknüpft
Sie haben die @Inheritance
Annotation vergessen.
Ich nehme an, dass Sie eine einzige Tabelle für alle Adressklassen verwenden. Sie sollten also präzisieren, dass Sie eine SINGLE_TABLE
-Strategie für die Handhabung von OOP- & gt; SQL-Mapping verwenden möchten. Es ist standardmäßig verwendet, aber Sie können es präzisieren, da es besser lesbar ist.
Fügen Sie es der Klassendeklaration Ihrer Superklasseneinheit hinzu:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
auf diese Weise:
%Vor%Bearbeiten:
user_address
wird in mehreren Relationen in der Entität User
als verknüpfbar verwendet. Hibernate vermittelt den Eindruck, dass es dies nicht akzeptiert.
Wenn Sie eine einzelne Beziehung verwenden, verlieren Sie die Vorteile, wenn Sie die Adressen kategorisieren.
Wenn Sie Ihr Schema ändern können, können Sie die Join-Tabelle entfernen und eine fk-Adresse hinzufügen, um die userId anzugeben. Entschuldigung, ich habe keine anderen Hinweise.
Haben Sie das Attribut
ausprobiert?@ManyToMany
Weil mit dieser Definition archiviert, was Sie haben
A und B, in denen A eine übergeordnete Instanz enthalten kann, für die es gibt viele Kinder in B und umgekehrt.