まず、2つのエンティティ間の関係について話していると思います。何かのようなもの
@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;
@see:JPAクエリでの子オブジェクトの戻りの順序
2012年9月1日にŁukaszRzeszotarskiによって追加されました:
@Sort
ただし、アノテーションを使用すると、SQLではなくメモリ(jvm)でオブジェクトが並べ替えられることを覚えておく必要があります。代わり@OrderBy
に、SQLサーバー側で並べ替えを行うアノテーションを使用できます。これらの注釈は両方とも、私の(ŁukaszRzeszotarski)の意見では、デフォルトで順序付けを設定する1つの弱点があります。私(ŁukaszRzeszotarski)は、order by句が使用されていることを「確認」したときに、独自のLinkedHashSet実装を使用して休止状態にします。
@see:SQLでの休止状態の順序