2009-05-21 6 views
6

私は@OneToManyの別のエンティティのリストを持つ永続エンティティを持っています。ユーザが編集できるようにするにはリストの順序が必要です。これはすばらしく機能します。私は完全にメモリ内のJavaリストを並べ替えることができますし、オブジェクトを保存()するとリンクテーブルのリンクの順序が変わります。ただし、ユーザーが設定した順序とは逆の順序になります。ただし、プログラムを閉じる前にエンティティを元に戻すと、再ロードされていないため、エンティティが正しく表示されます。プログラムをリロードすると、やはり逆方向になります。hibernate OneToMany順番は変えていますが、逆順で並べ替えるのですか?

これはちょうど私がするはずのものではない、その順序に依存していますか?とにかく注文があるので、別の注文コラムを作るのは冗長に思え、それを変更するように見えるかもしれません。私は後ろ向きに保存する必要はありません。

アイデア?

+0

ARGH!この問題は私を夢中にさせている、私はそれを修正したと思うだろうが、私は間違っていた。それは私が注文を変えたときに注文を元に戻すだけですが、私が選んだ注文とは逆の結果になります! なぜこのようなことが起きているのですか?オブジェクトを開いたり、リストの順序を変更したり、リストを保存したり、リフレッシュ()したりすることができます。 – Joshua

答えて

0

そのオブジェクト階層でcompareToを実装しましたか?

2

あなたのHibernateレイヤーはセットを使用していますか?私はそれがデフォルトで行うと信じています。設定されたインタフェース(およびその具体的な実装)は、の挿入順序を維持しません。

また、クエリを確認したい場合や、「注文者」を使用している場合は、

私はまた、デバッガを使用してメモリ内のコレクションを見てみたいと思います。あなたのビューコードがコレクションを並べ替えることができます。少なくとも、デバッガはあなたのコレクションが逆の正確なポイントを知るのに便利です。

2

私はリストを使ってこれを直接達成する方法がないと思います。あなたは、エンティティの順序の上に、ユーザのフルコントロールを与えたい場合は、たとえば新しいフィールドを追加する必要があり、

@Entity 
public class Todo { 
    @Id private Long id; 
    private int position; 
    // + public setter/getter 
} 

@Entity 
public class Todos { 
    @Id private id; 

    @OneToMany 
    private List<Todo> todos = new LinkedList<Todo>(); 
    // + public setter/getter  
} 

をし、その後に位置によって順序を置く仕事で私たちは以下を使用しますすべてのクエリを実行するか、Todosのコンパレータを実装し、Collections.sort(List lst、Comparator cmp)を使用してメモリ内のリストをソートします。

public class TodoComparator implements Comparator { 
    public int compare(Object o1, Object o2) { 
    Todo t1 = (Todo)o1; 
    Todo t2 = (Todo)o2; 
    return t2.getPosition() - t1.getPosition(); 
    } 
} 

Collection.sort(todos、new TodosComparator());

for(int pos=0; pos < todos.size(); pos++) 
    todos.get(pos).setPosition(pos); 

とドスを保存:あなたのユーザーの後

は、リストの番号を変更(前に保存)、リストを並べ替えるに仕上げています。そして、完全なコントロールを楽しんでください。

+0

こんにちはJoshua、私の答えが助けてくれたら、私は投票してください。それとも緑のチェックマークを付けてください? (良い答えを与えることは本当にたくさんの仕事です) – H2000

+0

いい答えです。しかし、コードを書式設定する必要があります。 –

+0

Thxs、私はコードを構成しました。 – H2000

0

あなたは直接リストで操作していますか?

object.getItems().add/remove/set ... 

その後、ワンショットでのフルコレクションを設定した後、その上で動作してコピー

List items = new ArrayList(object.getItems()); 

を作る代わりに、試してみてください:

object.setItems(items) 
4

HibernateはIndexColumnアノテーションを使用して注文した要素の支持を得ています。

ここ

"Java Persistence with Hibernate" bookからの例です:

@org.hibernate.annotations.CollectionOfElements 
@JoinTable(
name = "ITEM_IMAGE", 
joinColumns = @JoinColumn(name = "ITEM_ID") 
) 
@org.hibernate.annotations.IndexColumn(
name="POSITION", base = 1 
) 
@Column(name = "FILENAME") 
private List<String> images = new ArrayList<String>(); 
1

私は同じ問題に走った、と私は単に別の記事hereに示唆されているように@OrderBy注釈を追加することによって、それを修正しました。

@Entity 
    @Table(name = "my_library") 
    public class MyLibrary implements java.io.Serializable{ 

    (...omitted) 

    private List<Book> bookList = new ArrayList<Book>(); 

    @OneToMany(mappedBy = "library", cascade = CascadeType.ALL) 
    @OrderBy 
    public List<Book> getBookList() { 
     return bookList; 
    } 

    public void setBookList(List<Book> bookList) { 
     this.bookList= bookList; 
    } 

    } 

は、それから私はgetBookList(することができるよ)DBに存続しながら、私は挿入同じ順序として:私はここに私のコードは、同様にあなたの問題を解決することができるはずだと思います。 @OrderBy( "xxxColumn")のような列名を指定しないと、デフォルトでそのエンティティの主キーが使用されます。私の場合は、BookのinstanceIdを使用しています。これは、常に挿入順序と同じ順序に従います。

しかし、最初は逆順であった理由が不思議です。

関連する問題