Ist @ManyToMany (mappedBy = ...) + @OrderColumn von der JPA unterstützt?

8

Ich habe eine Entität wie folgt zugeordnet:

%Vor%

Es hat einen zusammengesetzten Schlüssel (round_id, ordinal_nbr) , um die Reihenfolge der Gruppen in einer Runde anzugeben.

Stellen Sie sich nun eine Join-Tabelle vor, die Entitäten enthält, die die geordneten Gruppen über eine Selbstreferenz (von Gruppe zu Gruppe) verknüpfen:

%Vor%

Ich weiß, dass es möglich ist, @ManyToMany + @JoinTable + @OrderColumn für die besitzende Entität zuzuordnen (was auch immer ich wähle):

%Vor%

Frage:

Wird für die eigene Seite die umgekehrte Beziehung @ManyToMany(mappedBy = ...) auch mit @OrderColumn abgebildet?

%Vor%

Definiert die JPA 2 Spezifikation, um dies zu erlauben oder zu leugnen?

Danke

Update 1:

Das Obige ist im Wesentlichen eine Graphstruktur. Hier ist ein Beispiel:

Die Tabelle GroupLinks enthält die eingerahmten Entitäten. Betrachtet man nur die Entität B2 Group , enthält die Liste parents (a,1,b,2) und (a,2,b,2) . Wie für die children -Liste enthält es (b,2,c,1) , (b,2,c,2) und (b,2,c,3) .

Wie Sie sehen können, kollidieren die Entitäten in den Listen von B2 nicht, daher sollte ein @OrderColumn für beide Relationen parents und children funktionieren - zumindest in Theorie. Aber was ist die Praxis hier (JPA)?

Beachten Sie, dass das einfache Testen von Hibernate und / oder EclipseLink nicht wirklich die Frage beantwortet, ob die JPA 2-Spezifikation oder ein JPA-kompatibler Anbieter dieses Szenario unterstützen sollte oder muss.

Update 2:

Wenn Sie die obigen Zuordnungen für Hibernate ausführen, ergibt sich die folgende Zuordnungsausnahme:

%Vor%

Das Entfernen von @OrderColumn für parent_ordinal_nbr führt zu derselben Ausnahme für die Beziehung children . Es sieht so aus, als ob Hibernate Ordnungsspalten nicht mag, die auch in Fremdschlüsseln verwendet werden.

Update 3:

Getestet mit EclipseLink auf GlassFish ... das funktioniert, keine Zuordnung Ausnahmen.

Dies wirft zwei weitere Fragen auf:

  1. Ordnet die JPA Spalten für die Reihenfolge der Fremdschlüssel nicht an? Es macht für mich keinen Sinn, warum sie nicht einfach funktionieren sollten ...
  2. Ist das ein Hibernate Bug?
Kawu 31.03.2012, 15:34
quelle

2 Antworten

6

Die javadoc oder OrderColumn enthält die von Ihnen gesuchten Informationen:

  

Die OrderColumn-Annotation wird auf der Seite des   Beziehung, die auf die zu bestellende Sammlung verweist. Das   Auftragsspalte ist nicht als Teil des Status der Entität oder sichtbar   einbettbare Klasse.

     

Die OrderBy-Annotation sollte für die Bestellung verwendet werden, die als sichtbar ist   persistenter Zustand und von der Anwendung gepflegt. Der AuftragBy   Annotation wird nicht verwendet, wenn OrderColumn angegeben ist.

OrderColumn wird verwendet, um der Join-Tabelle eine zusätzliche Spalte hinzuzufügen, mit der die Reihenfolge der Liste verwaltet wird. Die Order-Spalte, wie im Javadoc erwähnt, ist nicht Teil des Entity-Status. In Ihrem Fall scheint es, dass Sie die Elemente in der Liste nach einer ihrer persistenten Eigenschaften ordnen möchten. In diesem Fall müssen Sie die Annotation OrderBy verwenden (oder einen Getter haben, der die Liste sortiert, bevor sie zurückgegeben wird).

    
JB Nizet 05.04.2012, 10:58
quelle
0

In OPENJPA gibt es ein Problem in Bezug auf @OrderColumn, die Abrufoperation funktioniert, aber das Speichern einer Entität erhält den Fehler "losgelöstes Objekt". Dieser Fehler ist mit dem Hinzufügen dieser Annotation (@OrderColumn) verbunden.

Die Lösung besteht darin, einen Komparator in der parent.getChildEntity-Klasse zu verwenden, um die untergeordnete Entitätsliste zu sortieren, wodurch die Verwendung von @OrderColumn vermieden wird.

%Vor%

Gelöst :) John V, Col

    
John Velandia 08.08.2013 13:17
quelle