Hibernate préserve-t-il l’ordre d’un LinkedHashSet et si oui, comment?

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.