ERROR Tabelle mit diesem Namen [Benutzer_Adresse] ist bereits mit der Entität verknüpft, wenn dieselbe Join-Tabelle verwendet wird, um auf Unterklassen einer verknüpften Entität zu verweisen

9

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%     
Tony Alejandro 20.08.2016, 08:49
quelle

3 Antworten

2

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

    
Massimo 07.12.2016 16:53
quelle
1

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.

    
davidxxx 20.08.2016 09:00
quelle
1

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.

    
Gatusko 07.12.2016 21:12
quelle

Tags und Links