15

永続化中およびデータベースからの取得中にコレクションの順序を維持するための推奨される方法は何ですか?

@OrderBy は、選択した列の順序で行を保持する場合にのみ取得する場合にのみ機能するメモリ内の並べ替えであることを知っています。

データベース シーケンスに基づく列を使用することを選択したとします。コレクション内の要素がコレクション内と同じ順序で永続化されるように休止状態になります (たとえば、リスト)。

何か考えはありますか?

詳細:

クラス B と 1 対多の関係にあるクラス A があるとします。B には、DB のシーケンスに基づく主キー フィールド「Id」があります。

Class A {
  List<B> bList;
}

以下のように、要素 B の順序を A に保持したいと常に考えていました。

bList = { b1, b2, b3 }

これを実現する 1 つの方法は、@OrderBy (「Id ASC」) を使用することです。これは、リスト B が次の順序で永続化されている場合にのみ機能します。

----------------
Id ----bValue
----------------

1------ b1
2------ b2
3-------b3
------------------

ID順なので取得すると順番が保たれます。

コレクション B が次のように永続化されているとします。

----------------
Id ----bValue
----------------
1------ b2
2------ b1
3-------b3
------------------

取得すると、リスト B の順序がトスになります (Id 列による順序であるため)。だから私の質問は、コレクション B がリストに表示される順序と同じ順序で常に保持されるかどうかです。

4

1 に答える 1

31

OrderBy は、生成された SQL に order by 句を追加して、取得したコレクションのメンバーをターゲット エンティティのテーブルの列で並べ替えます。

@OrderBy("lastname ASC")
public List<Student> students;

次のようなSQLクエリを生成します

select ... order by student.lastname ASC

OrderColumn は、リスト内のエンティティのインデックスを含む、テーブル内の追加の列の名前を定義します。リスト内の要素の順序を変更すると、Hibernate はこの列の値を変更します。学生がこの列の値として 0、3、および 5 を持っている場合、リストは次のようになります。

[student0, null, null, student3, null, student5]

これは、これら 2 つの注釈の javadocで詳しく説明されています。

編集:

B 識別子が割り当てられる順序は、これらの B インスタンスを永続化する方法によって異なります。

  • session.save()、 ofを明示的に呼び出すとsession.saveOrUpdate()、ID がエンティティに割り当てられるため、b1、b2、および b3 に対して呼び出すと順序が尊重されます。
  • 私の知る限り、他のすべてのメソッド (cascading、merge()、persist()) は順序を保証しません (マージまたは永続化してから を除くflush())

したがって、リストに b1、b2、b3 をこの順序で保持する場合は、それらが永続化される方法に関係なく@OrderColumn、コレクションに注釈を追加することをお勧めします。Hibernate は、この列に b1 の場合は 0、b2 の場合は 1、b3 の場合は 2 を自動的に入力します。親エンティティをリロードすると、それらはリスト内で同じ順序になります。

于 2012-07-11T13:09:22.997 に答える