Question

J'ai une liste d'objets et chaque objet de la liste a une position qui ne peut pas changer sauf modification explicite, autrement dit, les objets sont dans une file d'attente. Quelle collection dois-je utiliser dans ma classe d'entité pour stocker ces objets et comment cette collection doit-elle être annotée?

J'ai actuellement cette

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  List<Bar> bars = new ArrayList<Bar>();
  ...
}

Si cela n’est pas possible uniquement avec JPA, j’utilise EclipseLink en tant que fournisseur JPA. Par conséquent, les annotations propres à EclipseLink seront acceptables sans autre solution.

EDIT: Remarquez, le problème n’est pas que Java ne conserve pas l’ordre, je sais que la plupart des collections le font, le problème est que je ne connais pas un moyen intelligent pour JPA de préserver l’ordre. Il est possible d'avoir un identifiant de commande et d'effectuer un ordre de requête, mais dans mon cas, il est fastidieux de le conserver (car l'interface utilisateur permet de réorganiser des articles) et je recherche un moyen plus intelligent de le faire.

Était-ce utile?

La solution

Si vous souhaitez que cet ordre soit commandé après un aller-retour en SQL, vous devez fournir une sorte d'ID d'ordre au sein de l'entité elle-même - SQL est naturellement orienté sur les jeux plutôt que sur les listes. Vous pouvez ensuite effectuer un tri après les avoir récupérées ou vous assurer que votre requête spécifie également l'ordre.

Si vous attribuez à l'entité un ID entier généré automatiquement, cela pourrait fonctionner, mais je ne voudrais pas le garantir.

Autres conseils

Utilisez un identifiant d'ordre de tri, comme suggéré par Jon, puis ajoutez une annotation @OrderBy en dessous de @OneToMany. Ceci ordonnera toute requête en fonction du champ spécifié.

Par exemple, si vous ajoutez un nouveau champ appelé "sortId". à Bar, Foo ressemblerait à ceci:

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  @OrderBy("sortId ASC")
  List bars = new ArrayList();
  ...
}

Vous pouvez

  1. Trier une liste avant la création
  2. Trier une liste après sa création
  3. Utilisez une collection qui effectue un tri sur insertion. TreeMap, TreeSet

Une liste chaînée implémente l'interface de file d'attente en java et vous permet d'ajouter des éléments au milieu ...

TBH la plupart des collections sont commandées, n'est-ce pas ...

Vérifiez la documentation, la plupart disent si elles sont commandées ou non.

Cela vaut la peine d'essayer LinkedList au lieu de ArrayList, cependant, comme l'a dit Jon, vous devez trouver un moyen de conserver les informations de commande.

Une solution impliquera probablement de donner un numéro de commande à chaque entrée et de la stocker sous forme de carte SortedMap lors de la conversion dans la liste, si vous en avez besoin.

Cependant, ORM pourrait éventuellement être suffisamment intelligent pour effectuer toutes les conversions pour vous si vous stockiez la collection sous le nom LinkedList.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top