Ответ 1
Во-первых: Я предполагаю, что вы говорите о связи между двумя сущностями. Что-то вроде
@Entity
public class A {
@ManyToMany
@JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") })
private Set<B> bSet = new LinkedHashSet<B>();
}
Спящий режим не сохраняет порядок сам по себе!
Если вы посмотрите на классы, используемые при загрузке объекта A
из базы данных, то Set
bSet
имеет тип PersistentSet
, который является оберткой вокруг другого Set
, и это (в моем случае) нормальный HashSet
. (HashSet
не сохраняет порядок своих элементов.)
Даже если Hibernate использовал List
или LinkedHashSet
, все же нецелесообразно основывать реализацию на естественном (не гарантированном) порядке базы данных. Для MySQL это своего рода анти-шаблон.
Но вы можете использовать аннотацию @Sort
(org.hibernate.annotations.Sort
), чтобы сделать вашу сортировку явной. Например:
@OneToMany(mappedBy = "as")
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class);
public SortedSet<C> cs;
@see: Заказ возврата дочерних объектов в запрос JPA
Добавил (а) Łukasz Rzeszotarski 1 сентября 2012:
Но мы должны помнить, что использование аннотации @Sort
вызывает сортировку объектов в памяти (jvm), а не в sql. Вместо этого мы можем использовать аннотацию @OrderBy
, которая вызывает сортировку на стороне сервера sql. Обе эти аннотации имеют в моем (Łukasz Rzeszotarski) мнение одну слабость, которая настроила порядок по умолчанию. Я (Łukasz Rzeszotarski) предпочел бы спящий режим использовать собственную реализацию LinkedHashSet, когда он "видит" этот порядок order by.
@see: Заказ Hibernate в sql