Pregunta

Tengo una lista de objetos y todos y cada uno de los objetos en la lista tienen una posición que no puede cambiar a menos que se cambie explícitamente, en otras palabras, los objetos están en una cola. ¿Qué colección debo usar en mi clase de entidad para almacenar estos objetos y cómo se debe anotar esa colección?

Actualmente tengo esto

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  List<Bar> bars = new ArrayList<Bar>();
  ...
}

Si esto no es posible con JPA puramente, estoy usando EclipseLink como mi proveedor de JPA, por lo que las anotaciones específicas de EclipseLink estarán bien si nada más ayuda.

EDITAR: tenga en cuenta a las personas, el problema no es que Java no conserve el orden, sé que la mayoría de las colecciones lo hacen, el problema es que no conozco una forma inteligente para que JPA conserve el pedido. Es posible tener un ID de pedido y hacer que la consulta se ordene por él, pero en mi caso mantener el ID de pedido es laborioso (porque la interfaz de usuario permite reordenar elementos) y estoy buscando una forma más inteligente de hacerlo.

¿Fue útil?

Solución

Si desea que esto se ordene después de un viaje de ida y vuelta a SQL, debe proporcionar algún tipo de ID de pedido dentro de la propia entidad: SQL está naturalmente orientado a conjuntos en lugar de a listas. Luego puede ordenar después de recuperarlos o asegurarse de que su consulta especifique también el ordenamiento.

Si le da a la entidad un ID entero generado automáticamente, esto podría funcionar, pero no me gustaría garantizarlo.

Otros consejos

Use una identificación de orden de clasificación, como sugirió Jon, luego agregue una anotación de @OrderBy debajo de @OneToMany. Esto ordenará cualquier consulta por el campo especificado.

Como ejemplo, si agrega un nuevo campo llamado " sortId " a Bar, Foo se vería así:

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  @OrderBy("sortId ASC")
  List bars = new ArrayList();
  ...
}

Puedes

  1. Ordenar una lista antes de la creación
  2. Ordenar una lista después de la creación
  3. Use una colección que realice una ordenación al insertar. TreeMap, TreeSet

Una lista vinculada implementa la interfaz de cola en Java y le permite agregar cosas en el medio ...

TBH, la mayoría de las colecciones están ordenadas, ¿no? ...

Revise los documentos, la mayoría dice si están ordenados o no.

Vale la pena probar LinkedList en lugar de ArrayList, sin embargo, como dijo Jon, necesita encontrar una forma de persistir en la información del pedido.

Una solución probablemente implicará emitir un número de pedido a cada entrada y almacenarlo como un SortedMap, al convertirlo en la Lista, si la Lista es lo que necesita.

Sin embargo, ORM podría ser lo suficientemente inteligente como para hacer todas las conversiones por usted si almacena la colección como LinkedList.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top