2012-03-31 4 views
8

Ich habe eine kartiert Einheit wie folgt:Ist @ManyToMany (mappedBy = ...) + @OrderColumn von der JPA unterstützt?

@Entity 
@Table(name = "Groups") 
@IdClass(value = GroupId.class) 
public class Group implements Serializable 
{ 
    @Id 
    @Column(name = "round_id") 
    private Integer roundId; 

    @Id 
    @Column(name = "ordinal_nbr") 
    private Integer ordinalNbr = 0; 

    ... 
} 

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

Nun stellen Sie eine Tabelle Einheiten verbinden enthält, die die geordneten Gruppen über eine Selbstbezug verknüpfen (von Gruppe zu Gruppe):

CREATE TABLE GroupLinks 
(
    parent_round_id INTEGER NOT NULL, 
    parent_ordinal_nbr SMALLINT NOT NULL, 
    child_round_id INTEGER NOT NULL, 
    child_ordinal_nbr SMALLINT NOT NULL, 
    PRIMARY KEY (parent_round_id, parent_ordinal_nbr, child_round_id, child_ordinal_nbr), 
    FOREIGN KEY (parent_round_id, parent_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr), 
    FOREIGN KEY (child_round_id, child_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr) 
); 

Ich weiß, es ist möglich, @ManyToMany + @JoinTable + @OrderColumn für die besitzende Einheit zur Karte (je nachdem, was ich wählen?):

@ManyToMany 
@JoinTable(name = "GroupLinks", joinColumns = {@JoinColumn(name = "parent_round_id", referencedColumnName = "round_id"), @JoinColumn(name = "parent_ordinal_nbr", referencedColumnName = "ordinal_nbr")}, inverseJoinColumns = {@JoinColumn(name = "child_round_id", referencedColumnName = "round_id"), @JoinColumn(name = "child_ordinal_nbr", referencedColumnName = "ordinal_nbr")}) 
@OrderColumn(name = "child_ordinal_nbr") 
private List<Group> children; 

Frage:

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

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

Dank


Update 1:

Die oben ist im Wesentlichen eine Graphenstruktur. Hier ein Beispiel:

IMAGE

Die GroupLinks Tabelle enthält die Box-Einheiten. Wenn nur die Entität B2 Group betrachtet wird, enthält die Liste parents(a,1,b,2) und (a,2,b,2). Wie für die children Liste wird es (b,2,c,1), (b,2,c,2) und (b,2,c,3) enthalten.

Wie Sie die Einheiten in den Listen der B2 sehen können nicht kollidieren, so sollte ein @OrderColumn in Ordnung arbeiten für beiden Beziehungenparents und children - zumindest in der Theorie. Aber was ist die Praxis hier (JPA)?

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


Update 2:

die obigen Zuordnungen auf der Ruhe Ergebnisse in der folgenden Abbildung Ausnahme Versuch:

Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: com.kawoolutions.bbstats.model.Group.parents column: parent_ordinal_nbr 
    at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:340) 
    at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:363) 
    at org.hibernate.mapping.Collection.validate(Collection.java:320) 
    at org.hibernate.mapping.IndexedCollection.validate(IndexedCollection.java:89) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1291) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1729) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) 
    ... 9 more 

die @OrderColumn für parent_ordinal_nbr Ergebnisse in der gleichen Ausnahme für die children Beziehung Entfernen . Es sieht so aus, als ob Hibernate Ordnungsspalten, die auch in Fremdschlüsseln verwendet werden, nicht mag.


Update 3:

Getestet mit Eclipse auf Glassfish ... das funktioniert, keine Zuordnung Ausnahmen.

Dies wirft zwei Fragen Followup:

  1. Ist die PPV nicht zulassen Fremdschlüssel, um Spalten? Es macht keinen Sinn für mich, warum sie nicht einfach funktionieren sollten ...
  2. Ist das ein Hibernate Bug?

Antwort

6

Die javadoc or OrderColumn hat die Informationen, die Sie suchen:

Die OrderColumn Anmerkung auf der Seite der Beziehung festgelegt ist, dass die Sammlung verweist, die bestellt werden soll. Die Bestellspalte ist nicht als Teil des Status der Entität oder embeddable-Klasse sichtbar.

Die OrderBy Annotation sollte für Bestellungen verwendet werden, die als persistenter Zustand sichtbar sind und von der Anwendung verwaltet werden. Die OrderBy 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 OrderBy-Annotation verwenden (oder einen Getter haben, der die Liste sortiert, bevor sie zurückgegeben wird).

+0

Was auch immer der Zustand eines Unternehmens bedeutet ... Followup Frage ist hier: http://stackoverflow.com/questions/10054400/jpa-ordercolumn-and- sichtbarer Zustand einer Einheit – Kawu

+0

Gute Erklärung. Zeigt wirklich den Unterschied zwischen OrderColumn und OrderBy. +1 –

0

In OpenJPA gibt es ein Problem in Bezug auf @OrderColumn, rufen die Operation funktioniert, aber eine Einheit Speichern erhält einen Fehler „frei stehende Objekt“, dieser Fehler das Hinzufügen dieser Anmerkung zugeordnet ist (@OrderColumn)

Die Lösung ist Verwenden Sie den Komparator in der parent.getChildEntity-Klasse, um die untergeordnete Entitätsliste zu sortieren. Dadurch wird die Verwendung von @OrderColumn vermieden.

Collections.sort(this.child, new Comparator<class_type>() { 
@Override 
     public int compare(class_type p1, class_type p2) { 
      return (int) (p1.getId() - p2.getId()); 
     } 

    }); 

Gelöst :) John V, Col

Verwandte Themen