Hibernate préserve-t-il l’ordre d’un LinkedHashSet et si oui, comment? Si cela dépend du type de firebase database, j’aimerais le savoir pour PostgreSQL.
Contexte:
Je sais à quoi sert un LinkedHashSet, et la raison pour laquelle je pose cette question est parce que je consigne les noms de certaines fonctions que j’exécute dans une table ‘logError’ qui a une relation plusieurs à plusieurs avec une table ‘functionName’ . J’ai besoin que ces fonctions restnt dans le même ordre que lorsque je les ai exécutées. Je trouve donc d’abord les objects ‘functionName’ correspondants, je les place dans un LinkedHashSet (après chaque fonction ayant échoué), puis je persiste dans l’object ‘logError’.
Maintenant, quand je récupère l’object ‘logError’ de la firebase database, sera-t-il toujours commandé? Et si oui, j’étais curieux de savoir comment cela se faisait par Hibernate.
Premièrement: je suppose que vous parlez d’une relation entre deux entités. Quelque chose comme
@Entity public class A { @ManyToMany @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") }) private Set bSet = new LinkedHashSet(); }
Hibernate ne préserve pas l’ordre par lui-même!
Si vous examinez les classes utilisées lorsque l’entité A
est chargée à partir de la firebase database, alors Set
bSet
est du type PersistentSet
, qui encapsule un autre Set
et il s’agit (dans mon cas) d’un HashSet
normal. ( HashSet
ne conserve pas l’ordre de ses éléments.)
Même si Hibernate utilisait List
ou LinkedHashSet
, il est toujours déconseillé de baser l’implémentation sur l’ordre naturel (non garanti) de la firebase database. Pour MySQL, c’est une sorte d’anti-pattern.
Mais vous pouvez utiliser l’annotation @Sort
( org.hibernate.annotations.Sort
) pour rendre votre sorting explicite. Par exemple:
@OneToMany(mappedBy = "as") @Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class); public SortedSet cs;
@see: Ordonner le retour des objects enfants dans une requête JPA
Ajouté par Łukasz Rzeszotarski le 1er septembre 2012:
Mais il ne faut pas oublier que l’utilisation de l’annotation @Sort
entraîne le sorting des objects en mémoire (jvm) et non en sql. À la place, nous pouvons utiliser l’annotation @OrderBy
qui entraîne le sorting du côté serveur SQL. À mon avis (Łukasz Rzeszotarski), ces deux annotations présentent un point faible: la commande par défaut. Je (Łukasz Rzeszotarski) préférerais qu’hibernate utilise sa propre implémentation LinkedHashSet lorsqu’il «voit» que la clause order by est utilisée.
@see: Commande Hibernate en sql
Les ensembles n’ont pas d’ordre inhérent, pas plus que les tables de firebase database – vous pouvez appliquer un ordre lorsque vous interrogez les données, mais à moins de conserver cet ordre (en obtenant par exemple des lignes et en les plaçant dans un conteneur ordonné comme un lien liste), les données renvoyées seront également non ordonnées.
Lorsque je dois conserver l’ordre d’une liste d’éléments, j’utilise une Map
et non une List
.
@OneToMany(fetch = FetchType.EAGER, mappedBy = "rule", cascade = CascadeType.ALL) @MapKey(name = "position") private Map actions = LazyMap.decorate(new LinkedHashMap<>(), FactoryUtils.instantiateFactory(RuleAction.class, new Class[] { Rule.class }, new Object[] { this }));
Dans cet exemple Java
, position
est une propriété Integer de RuleAction
ainsi l’ordre est conservé de cette façon. Je suppose qu’en C#
cela ressemblerait assez.