JPA Annotations @ManyToMany + reihenfolge als key

Status
Nicht offen für weitere Antworten.

mephi

Bekanntes Mitglied
Hi,

steh jetzt wieder vor einem kleinen Problem. Ich habe 2 Klassen. Sequence und Event. Die beiden haben eine ManyToMany Beziehung. Jede Sequence hat eine Liste mit Events. Hier ist aber die Reihenfolge wichtig. Wie bring ich die da am besten rein. Mein Konzept für Java war es einfach die Reihenfolge in der ArrayList zu nehmen. Nur wie geb ich das per Annotations an?
Habs mal mit einer Map versucht, allerdings find ich das nicht so praktisch um dann in Java eventuell die Reihenfolge zu ändern.

Code:
	@ManyToMany(targetEntity=EventImpl.class)
	@JoinTable(inverseJoinColumns=@JoinColumn(name="event_id"))
	Map<Integer, IEvent> eventMap = new HashMap();

zumal ich hier auch nicht weiß wie ich den key der map in der DB ändere..
 
Beim Mappen von Lists benutzt Hibernate entweder Bag- oder List-Semantik, je nachdem ob Du mit @IndexColumn mappst oder nicht. Bag-Semantik sollte man in den meisten Fällen vermeiden.
Wenn Du @IndexColumn benutzt, dann persistiert Hibernate die Reihenfolge Deiner Liste, indem er den Index der Elemente in einer Spalte speichert. Den Namen der Spalte gibst Du als Attribut in @IndexColumn an.
 
schade, gibts noch einen anderen weg? wäre sehr nice wenn ich mit minimalem aufwand auf ein anderes framework wechseln könnte
 
Hab mich nie um eine andere Lösung bemüht, da Hibernate bei mir gesetzt ist. Vielleicht findet sich ja ein TopLink Experte, der dazu was sagen kann...

Kann Dir aber gleich sagen, dass das nur eine von einigen Stellen ist, wo man mit reinem JPA an seine Grenzen stößt. Hibernate bietet sehr viele Erweiterungen, die durch JPA nicht spezifiziert sind.
 
Hoffentlich findet sich jemand der sich da auskennt. Ich finde dazu auch nichts. Aber würde mich wundern wenn ein Standard so einen Fall nicht beachten würde.
 
Hallo,

Meinst du vielleicht sowas:

@Entity public class Course {
...
@ManyToMany
@OrderBy("lastname ASC")
public List<Student> getStudents() {...};
...
}
@Entity public class Student {
...
@ManyToMany(mappedBy="students")
@OrderBy // PK is assumed
public List<Course> getCourses() {...};
...
}

Ist aus der JPA Doku. (wuerde das nicht an die Methoden schreiben sondern an die Attribute...)

EDIT:

ps: @IndexColumn funktionert uebrigens auch mit "JPA" oder anders ausgedrueckt es ist moeglich Hibernate und JPA Annotations zu mischen...
 
hm, das geht nicht da ich nach positionsnummern sortieren möchte die in jeder sequence anders sein können und ein event kann auch in einer sequence öfter vorkommen.
 
Das Feature ist für JPA 2.0 geplant, man muss bedenken das 1.0 meist etwas "lückenhaft" ist.
 
klarkimming hat gesagt.:
@IndexColumn funktionert uebrigens auch mit "JPA" oder anders ausgedrueckt es ist moeglich Hibernate und JPA Annotations zu mischen...
Aber wenn Du von Hibernate auf eine andere JPA Implementierung umschwenkst, dann funktionierts halt nicht mehr. Mit @IndexColumn bist Du an Hibernate gebunden.

@OrderBy wird in bestimmten Fällen ignoriert, nämlich wenn man eigene Queries baut (z.B. per HQL bei Hibernate). Ansonsten gäbs noch die Lösung mit @Sort und einem Set, aber auch das ist ne Hibernate Annotation + Sets sind in Bezug auf ORMs teilweise eklig (Stichwort equals/hashcode und Lazy Loading).
 
hmm, dann werd ich versuchen dass mit einer map zu lösen. dann muss ich mir halt beim löschen von elementen aus der map noch ne kleine funktion schreiben um die anderen elemente aufzurücken.

oder auf jpa 2.0 warten *g*
 
Im Moment (1.0) kann kann nicht vernünftig mit JPA entwickeln, ohne sich auf eine Implementierung festzulegen, alles andere wird "schräg" imho, da der Standard eben noch so Lückenhaft ist.
 
Wann soll denn 2.0 kommen? Ich finde nur Infos dazu, dass EclipseLink die Referenzimlpementierung dafür wird, aber nicht wie weit sie sind oder ähnliches
 
ok danke für die hilfe 🙂
falls noch jemand eine bessere lösung als ne map einfällt, dann bin ich immer offen dafür 🙂
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben