2009-05-21 15 views
6

Tengo una entidad persistente que tiene una lista @OneToMany de otra entidad y necesito el orden de la lista para que el usuario pueda editarla, lo que funciona maravillosamente. Puedo reordenar por completo la lista java en la memoria y cuando guardo() el objeto cambia el orden de los enlaces en la tabla de enlaces. Sin embargo, cambia en el orden inverso al establecido por el usuario. Sin embargo, si hace una copia de seguridad de la entidad antes de cerrar el programa, se muestra correcta, porque no se está recargando. Si recarga el programa, nuevamente, está al revés.hibernar OneToMany ¿El ordenamiento de las listas persiste pero se invierte?

¿Esto no es algo que se supone que debo hacer, depende de ese orden? Pero hacer otra columna de orden parece redundante ya que hay un pedido de todos modos, y puedo parecer que lo cambio. Solo necesito guardar, no al revés.

¿Alguna idea?

+0

ARGH! Este problema me está volviendo loco, pensé que lo había solucionado, pero estaba equivocado. ¡Solo invierte el orden CUANDO cambio el orden, aunque obtengo el orden inverso al que elegí! ¿Por qué sucede esto, puedo abrir un objeto, cambiar el orden de la lista, guardarlo() y actualizarlo() y ahora el orden se invierte! – Joshua

Respuesta

0

¿Ha implementado compareTo en esa jerarquía de objetos?

2

¿Su capa Hibernate usa Conjuntos? Creo que lo hace por defecto. La interfaz establecida (y sus implementaciones concretas) no mantienen el orden de inserción.

Como alternativa, es posible que desee ver sus consultas, ¿está utilizando una "orden por"?

También intentaría mirar la colección en memoria usando un depurador. Su código de vista podría reordenar la Colección. Por lo menos, el depurador será útil para ver en qué punto exacto su colección está siendo reversa.

2

Creo que no hay forma de lograr esto directo con las listas. Nosotros en el trabajo usamos el siguiente:

Si usted quiere dar a su usuario un control total sobre el orden de las entidades, se debe añadir un nuevo campo, por ejemplo:

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

y luego poner una orden por la posición en todas las consultas o implementar un Comparador para Todos y usar Collections.sort (List lst, Comparator cmp) para ordenar su lista en la 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, nuevo TodosComparator());

después de su usuario ha terminado de reordenar la lista, (antes de guardar) renumerar la lista:

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

y guardar todos. Y disfruta el control total.

+0

Hola Joshua, si mi respuesta me ayudó, ¿puedes votar por mí o marcarlo con una marca de verificación verde? (Para dar una buena respuesta es realmente mucho trabajo) – H2000

+0

Buena respuesta. Pero debes formatear tu código. –

+0

Thxs, formé el código. – H2000

0

¿Está trabajando directamente en la lista?

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

Trate en lugar de hacer una copia

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

que operaba entonces en que, a continuación, establecer la colección completa de una sola vez:

object.setItems(items) 
4

Hibernate tiene apoyo de elementos ordenados utilizando IndexColumn anotación.

Aquí se muestra un ejemplo de "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

me encontré con el mismo problema, y ​​lo fijé simplemente añadiendo @OrderBy anotación como se sugiere en otro artículo here. Creo que debería ser capaz de resolver su problema, así, aquí está mi código:

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

    } 

entonces yo soy capaz de getBookList() como el mismo orden Inserté mientras que persiste a DB. Cuando no especificamos el nombre de la columna como @OrderBy ("xxxColumn"), utiliza la clave principal de esa entidad de forma predeterminada. En mi caso, usa instanceId of Book, que siempre seguirá el mismo orden que insert order, por lo que sirve bien a mi necesidad.

Sin embargo, tengo curiosidad acerca de por qué la orden fue inversa en primer lugar.

Cuestiones relacionadas