Hibernate: @OrderBy vs @OrderColumn pour maintenir l'ordre d'une collection
Quel est le meilleur moyen pour le maintien de l'ordre d'une collection, tandis que la persistance et aussi lors de la récupération de la base de données?
Je sais que @OrderBy est plus en mémoire le tri, qui pourrait travailler en récupérant uniquement lorsque vous presist les lignes dans l'ordre de la colonne que vous avez choisi.
Disons que j'ai choisi d'utiliser une colonne soutenu par une base de données de séquence, se mettra en veille prolongée assurez-vous que les éléments de la collection sont conservées dans le même ordre que dans la collection (disons Liste).
Toute pensée?
Plus de détails:
Disons que j'ai une classe qui a de un-à-plusieurs relation avec la classe B. B est un champ de clé primaire, ‘Id’, qui est soutenu par une séquence en DB.
Class A {
List<B> bList;
}
J'ai toujours voulu conserver l'ordre des éléments de B comme ci-dessous:
bList = { b1, b2, b3 }
Un moyen d'y parvenir est l'utilisation de @OrderBy (“Id ASC”). Cela ne peut fonctionner que lorsque la liste B est maintenu dans l'ordre ci-dessous:
----------------
Id ----bValue
----------------
1------ b1
2------ b2
3-------b3
------------------
Lorsque nous récupérer car il est commandé par l'Id, le maintien de l'ordre.
Laisser'say la collection B est maintenu dans la manière suivante:
----------------
Id ----bValue
----------------
1------ b2
2------ b1
3-------b3
------------------
Lorsque nous récupérer, de l'ordre de la liste B de l'aller pour un tirage au sort (puisque c'est l'ordre par colonne Id). Donc ma question, si la collection B persévérer toujours dans le même ordre que dans la liste ou non.
source d'informationauteur Phani Kumar
Vous devez vous connecter pour publier un commentaire.
OrderBy ajoute une clause order by de la requête SQL générée à l'ordre les membres de l'extrait de la collection par une colonne de la table de l'entité cible:
va générer une requête SQL comme
OrderColumn définit le nom d'une colonne supplémentaire dans la table, contenant le indice de l'entité dans la liste. Si vous modifiez l'ordre des éléments dans la liste, Hibernate va modifier la valeur de cette colonne. Et si vos élèves ont de 0, 3 et 5 sont les valeurs de cette colonne, la liste sera
C'est bien décrite dans la javadoc de ces 2 annotations.
EDIT:
L'ordre dans lequel B identifiants sont attribués dépend de la façon dont vous persistez ces instances:
session.save()
desession.saveOrUpdate()
il attribue un IDENTIFIANT de l'entité, afin de l'appelant pour b1, b2 et b3 respectera l'ordreflush()
)Donc, si vous voulez la liste de tenir b1, b2 et b3 dans cet ordre, indépendamment de la façon dont ceux-ci sont persistantes, votre meilleur pari est d'ajouter une
@OrderColumn
annotation à la collection. Hibernate va automatiquement remplir cette colonne à 0 pour le b1, 1 b2 et 2 b3. Et quand vous allez recharger l'entité mère, Ils seront dans le même ordre dans la liste.