2009-05-21 13 views
6

Ho un'entità persistente che ha un elenco @OneToMany di un'altra entità e ho bisogno che l'ordine delle liste sia in grado di essere modificato dall'utente, che funziona meravigliosamente. Posso completamente riordinare l'elenco java in memoria e quando salvo() l'oggetto cambia l'ordine dei collegamenti nella tabella di collegamento. Tuttavia, cambia in ordine inverso rispetto a ciò che l'utente imposta. Tuttavia, se si esegue il backup dell'entità prima di chiudere il programma, viene visualizzato correttamente, poiché non si ricarica. Se ricarichi il programma, di nuovo, è indietro.Hibernate OneToMany List ordina in modo permanente ma sta invertendo?

Questo non è qualcosa che dovrei fare, dipende da quell'ordine? Ma rendere la colonna di un altro ordine sembra ridondante dato che comunque c'è un ordine, e posso sembrare di cambiarlo. Ho solo bisogno di salvare non indietro.

Qualche idea?

+0

ARGH! Questo problema mi sta facendo impazzire, pensavo di averlo risolto, ma mi sbagliavo. Inverte solo l'ordine QUANDO cambio l'ordine, sebbene ottenga il contrario dell'ordine che ho scelto! Perché sta succedendo questo, posso aprire un oggetto, cambiare l'ordine della lista, salvarlo() e aggiornarlo() e ora l'ordine è invertito! – Joshua

risposta

0

Avete implementato il confronto su quella gerarchia di oggetti?

2

Il layer Hibernate viene utilizzato con Sets? Credo che lo faccia per impostazione predefinita. L'interfaccia impostata (e le relative implementazioni concrete) non mantiene l'ordine di inserimento.

In alternativa, potresti voler controllare le tue domande, stai usando un "ordine per"?

Ho anche provato a guardare la raccolta in memoria utilizzando un debugger. Il tuo codice di visualizzazione potrebbe essere riordinare la raccolta. Per lo meno il debugger sarà utile per vedere in quale punto esatto la tua raccolta viene invertita.

2

Penso che non ci sia modo di ottenere questo direttamente con le liste. Siamo al lavoro utilizziamo il seguente:

Se volete dare il vostro pieno controllo dell'utente su ordine di entità, si dovrebbe aggiungere un nuovo campo, ad esempio:

@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  
} 

e poi mettere un ordine in base alla posizione in tutte le domande o implementare un comparatore per Todos e utilizzare Collections.sort (List lst, Comparator cmp) per ordinare la lista in memoria.

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());

dopo l'utente è finito a riordinare l'elenco, (prima di salvare) rinumerare l'elenco:

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

e salvare todos. E goditi il ​​pieno controllo.

+0

Ciao Joshua, se la mia risposta ti ha aiutato puoi votare per me o contrassegnarlo con un segno di spunta verde? (Per dare una buona risposta è davvero tanto lavoro) – H2000

+0

Buona risposta. Ma dovresti formattare il tuo codice. –

+0

Thxs, ho formulato il codice. – H2000

0

Sei operativo direttamente nell'elenco?

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

Prova invece fare una copia

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

poi operare su questo, quindi impostando la collezione completa in un solo colpo:

object.setItems(items) 
4

Hibernate ha il supporto di elementi ordinata utilizzando IndexColumn annotazione.

Ecco un esempio da "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

Ho incontrato lo stesso problema, e mi è stato risolto semplicemente con l'aggiunta di @OrderBy annotazione come suggerito in un altro articolo here. Penso che dovrebbe essere in grado di risolvere il problema, così, qui è il mio codice:

@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; 
    } 

    } 

allora io sono in grado di getBookList() come lo stesso ordine ho inserito mentre persistendo a DB. Quando non si specifica il nome della colonna come @OrderBy ("xxxColumn"), per impostazione predefinita utilizza la chiave primaria di tale entità. Nel mio caso, usa instanceId of Book, che seguirà sempre lo stesso ordine di un ordine di inserimento, quindi soddisfa bene le mie esigenze.

Tuttavia, sono curioso di sapere perché l'ordine è stato invertito in primo luogo.

Problemi correlati