Во-первых: я предполагаю, что вы говорите об отношениях между двумя сущностями. Что-то вроде
@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>();
}
Hibernate не сохраняет заказ сам по себе!
Если вы посмотрите на классы, используемые при загрузке сущности 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;
@ см .: Порядок возврата дочерних объектов в запросе JPA
Добавлено Łukasz Rzeszotarski 1 сентября 2012 г .:
Но мы должны помнить, что использование аннотации @Sort
приводит к сортировке объектов в памяти (jvm), а не в sql. Вместо этого мы можем использовать аннотацию @OrderBy
, которая вызывает сортировку на стороне сервера sql. Обе эти аннотации, по моему мнению (Лукаш Жешотарски), имеют одну слабость, которая устанавливает порядок по умолчанию. Я (Лукаш Жешотарский) предпочел бы использовать спящий режим, используя собственную реализацию LinkedHashSet, когда он «видит», что используется заказ order by.
@ см .: Спящий режим в sql