tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
802
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Hallo zusammen,

    kann man, sagen wir aus Sicht der JPA Spezifikation, oder aus Sicht der Hibernate Dokumentation (oder irgendeiner anderen Referenz/Quelle), davon ausgehen, dass die Reihenfolge der Elemente in einer Liste (z.B. ein Member einer Klasse vom Typ "List" oder "Set") stets erhalten bleibt, wenn man diese persistiert und danach wieder aus der Datenbank lädt?

    Ich meine natürlich, ohne im Query irgendeine Order o.Ä. anzugeben oder das Mapping sonstwie zu beeinflussen - also eine reine "OneToMany" bzw. "ManyToOne" Beziehung. Entspricht die Reihenfolge der Elemente in der Java Liste dann immer der Reihenfolge der Elemente in der Tabelle?

    Ich habe die Erfahrung gemacht, dass dies so ist. Aber bevor ich mich darauf sicher verlasse, hätte ich gerne eine verlässliche Quelle, die mir das bestätigt.


    Vielen Dank für Eure Hilfe!
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    Ich habe die Erfahrung gemacht, dass dies so ist. Aber bevor ich mich darauf sicher verlasse, hätte ich gerne eine verlässliche Quelle, die mir das bestätigt.
    Das habe ich auch schon beobachtet, hab das aber noch nicht explizit wo stehen sehen...
    wenn man per Hibernate eine List<SomeEntity> nachlädt kommen die Elemente in der Reihenfolge wie sie zuvor persistert wurden bzw. wie sie in ihrer "natürlichen" Ordnung vorliegen. Im Gegensatz dazu kann die Reihenfolge beim nachladen eines Set<SomeEntity> variieren. Das sieht man AFAIK auch sehr schon, das für List<...> eine andere SQL Query generiert wird als für ein Set<....>. Natürlich gibts zusätzlich noch den Unterschied, dass man bei einer List doppelte Einträge haben kann und bei einem Set nicht.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Hallo Thomas,

    vielen Dank für Deine Antwort - ich habe nochmal verschiedene Docs durchgesehen, konnte aber keine Bestätigung finden. Da die Reihenfolge der Elemente in meinem speziellen Anwendungsfall hier gerade eine sicherheitskritische Rolle spielen, werde ich mich nicht einfach auf meine Beobachtung verlassen, sondern eine extra Spalte für die Reihenfolge hinzufügen.

    Nochmals danke!
     

  4. #4
    minjaman minjaman ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    6
    Hallo DarthShader,

    Weder Set noch List sind in Deinem Sinne stabil. Du kannst Dich nicht auf Deine Beobachtung verlassen.

    Eine stabile Reihenfolge bekommst Du nur mit irgendeiner ausdrücklichen Ordnung.

    - Im Arbeitsspeicher mittels eines Comparators sortieren: @Sort
    - Indexspalte einführen: @OrderColumn
    - Order By in der Query

    Gruß
    Alexander
     
    Folien "JPA mit Hibernate": http://www.kunkelgmbh.de/jpa/jpa.html

  5. #5
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Hallo Alexander,

    vielen Dank für Deine Antwort.

    Kann man denn irgendwo nachlesen, dass man sich nicht auf die Reihenfolge verlassen kann? Natürlich sollte man sich im Umkehrschluss nicht darauf verlassen, wenn es auch nirgends steht

    Ich hab jedenfalls noch nie erlebt, dass die Reihenfolge nach dem Laden aus der Datenbank nicht mehr stimmte bzw. dieselbe war, wir beim Persistieren. Kennst Du einen Anwendungsfall, wo man deutlich sieht, dass es schief gehen kann, wenn man sich einfach auf die Reihenfolge verlässt?

    Danke für die Hinweise bezüglich der alternativen Möglichkeiten (@Sort, @OrderColumn etc.).
     

  6. #6
    minjaman minjaman ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    6
    Hallo DarthShader,

    Ich kenne es so, dass in der Regel die Datensätze bei Abfragen ohne Sortierkriterium in der Reihe geliefert werden, wie sie zuvor eingefügt wurden.

    Ein Fehlverhalten kannst Du wie folgt provozieren:
    - Vaterobjekt mit 2 Kindobjekten speichern.
    - Vaterobjekt wieder laden.
    --> Reihenfolge ist so wie Du sie vermutlich erwartest.
    - 0tes Kindobjekt aus der Liste entfernen und löschen.
    - An der 0ten Stelle wieder ein neues Kindobjekt in die Liste einfügen und speichern.
    --> Jetzt ist neues Objekt vor dem Alten.
    - Vaterobjekt wieder laden.
    --> Schwups, jetzt ist neues Objekt nach dem Alten.

    Gruß
    Alexander
     
    Folien "JPA mit Hibernate": http://www.kunkelgmbh.de/jpa/jpa.html

  7. #7
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Hallo Alexander,

    so wird natürlich klar, dass es nicht immer stimmen kann. In einem solchen Fall bildet sich quasi der Index des Elements einer Liste auf die id in der Tabelle ab. Den Eintrag an einem bestimmten Index, z.B. in einer ArrayList, kann man natürlich ersetzen, aber bei z.B. einer Autoincrement-Spalte in der DB kann man die ids nicht "wiederverwenden", diese werden ja stetig inkrementiert.

    Vielen Dank für das Beispiel!
     

Ähnliche Themen

  1. JPA Persistierung von einer Map abgeleiteten Klasse
    Von maxpade im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 17.05.10, 10:50
  2. Antworten: 2
    Letzter Beitrag: 26.04.10, 23:47
  3. Antworten: 4
    Letzter Beitrag: 21.02.10, 00:02
  4. Wie kann man in XSLT Elemente einer Liste zählen?
    Von mathiasn im Forum XML Technologien
    Antworten: 2
    Letzter Beitrag: 01.03.09, 09:34
  5. Elemente einer Liste zufällig sortieren / shuffle
    Von Thomas Darimont im Forum .NET Café
    Antworten: 0
    Letzter Beitrag: 30.08.07, 23:12