Die ManyToMany-Beziehung, die JPA mit dem Hibernate-Provider verwendet, erstellt keine Primärschlüssel

7

Ich habe zwei JPA-Entitäten (Client, InstrumentTraded) erstellt, die Hibernate als Provider mit einer ManyToMany-Beziehung verwenden. Nachdem Hibernate die Tabellen für MySQL generiert hat, scheint die ManyToMany-Beziehungstabelle keine Primärschlüssel für die beiden Fremdschlüssel zu enthalten. Dies ermöglicht doppelte Datensätze in der Viele-zu-Viele-Tabelle, was nicht das gewünschte Ergebnis ist.

Generierte Tabellen:

%Vor%

Bevorzugte Tabelle:

%Vor%

Entitäten:

%Vor%

Nach einigen Nachforschungen sieht es so aus, als ob die einzige Lösung darin besteht, eine Join-Tabelle mit zusätzlichen Spalten zuzuordnen Verwenden Sie @OneToMany @IdClass und eine zusammengesetzte Primärschlüsselklasse, wenn ich keine zusätzlichen Spalten benötige. Ist dies die einzige Lösung neben der, die ich in den obigen Code aufgenommen habe, die @UniqueConstraint mit den zwei Fremdschlüsselspalten im @ManyToMany Mapping verwendet? Es scheint ein bisschen lächerlich, wie viel Arbeit für ein solches Szenario nötig ist. Danke!

    
dukethrash 13.08.2010, 04:49
quelle

4 Antworten

15

Ich hatte ein ähnliches Problem. Alles, was ich getan habe, war, dass ich den Sammlertyp von Liste zu Menge geändert habe:

%Vor%

bis

%Vor%

Und irgendwie erzeugt Hibernate jetzt Primärschlüssel für die Join-Tabelle.

    
Antti Sulanto 14.09.2011 12:57
quelle
6

Hier ist ein Weg, um das Problem zu lösen:

Client.java:

%Vor%

Dies ist für unidirektionales Mapping. Wenn Sie eine bidirektionale Beziehung wünschen, ändern Sie das Mapping in InstrumentTraded.class auf dasselbe.

    
Shahriar 22.05.2011 09:10
quelle
2

Ihre Zuordnung sieht ungerade aus (insbesondere der joinColumn -Teil der @JoinTable Annotation). Ich würde so etwas erwarten:

%Vor%

Aber wenn Sie die Standardeinstellungen nicht überschreiben wollen (und ich nehme an, Sie tun das), würde ich einfach die @JoinTable überspringen.

    
Pascal Thivent 13.08.2010 05:21
quelle
0

Oder Teilen Sie Ihre @ManyToMany in die @OneToMany - @ManyToOne-Beziehung. Siehe hier wie Sie diese Zuordnung durchführen können

    
Arthur Ronald 13.08.2010 14:52
quelle