Foros del Web » Programación para mayores de 30 ;) » Java »

persistiendo una Collection (List)

Estas en el tema de persistiendo una Collection (List) en el foro de Java en Foros del Web. El problema es el siguiente: el ORM (TopLink) NO respeta el orden de los elementos que están en la List.. (los items de la Factura, ...
  #1 (permalink)  
Antiguo 01/07/2010, 06:49
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 10 meses
Puntos: 41
Exclamación persistiendo una Collection (List)

El problema es el siguiente: el ORM (TopLink) NO respeta el orden de los elementos que están en la List.. (los items de la Factura, el DetalleFactura).
Es decir

item1 .......................cant..........precio....... subTotal
item2 .......................cant..........precio....... subTotal
item3 .......................cant..........precio....... subTotal
item4 .......................cant..........precio....... subTotal

cuando hago el proceso de persistir la Factura y su respetiva List<DetalleFactura>
me guarda en cualquier orden.. y siempre distinto

item4, item2, item1, item3

item3, item1, item4, item3

Obs: Todo es persistido, las PK, fk , los serial (Postgre), todo se crea correctamente, solo que me hace el PUTISIMO RANDOM!! al insertar los DetalleFactura..

Código C:
Ver original
  1. EntityManager em = null;
  2.       try {
  3.          em = getEntityManager();
  4.          em.getTransaction().begin();
  5.          List<DetallesVenta> attachedDetallesVentaList = new ArrayList<DetallesVenta>();
  6.          for (DetallesVenta detallesVentaListDetallesVentaToAttach : facturaVenta.getDetallesVentaList()) {
  7.             detallesVentaListDetallesVentaToAttach = em.merge(detallesVentaListDetallesVentaToAttach);
  8.             attachedDetallesVentaList.add(detallesVentaListDetallesVentaToAttach);
  9.          }
  10.          facturaVenta.setDetallesVentaList(attachedDetallesVentaList);
  11.          em.persist(facturaVenta);
  12.          for (DetallesVenta detallesVentaListDetallesVenta : facturaVenta.getDetallesVentaList()) {
  13.             FacturaVenta oldFacturaOfDetallesVentaListDetallesVenta = detallesVentaListDetallesVenta.getFactura();
  14.             detallesVentaListDetallesVenta.setFactura(facturaVenta);
  15.             detallesVentaListDetallesVenta = em.merge(detallesVentaListDetallesVenta);
  16.             if (oldFacturaOfDetallesVentaListDetallesVenta != null) {
  17.                oldFacturaOfDetallesVentaListDetallesVenta.getDetallesVentaList().remove(detallesVentaListDetallesVenta);
  18.                oldFacturaOfDetallesVentaListDetallesVenta = em.merge(oldFacturaOfDetallesVentaListDetallesVenta);
  19.             }
  20.          }
  21.          em.getTransaction().commit();

Última edición por FiruzzZ; 01/07/2010 a las 07:58 Razón: mejora de dicción..
  #2 (permalink)  
Antiguo 01/07/2010, 09:56
Avatar de santana  
Fecha de Ingreso: mayo-2002
Mensajes: 90
Antigüedad: 22 años, 5 meses
Puntos: 0
Respuesta: persistiendo una Collection (List)

Hola, a simple vista me acorde de una vez que me sucedio eso. Lo solucione haciendo un Collections.sort() sobre la lista antes de empezar a iterarla.

No recuerdo bien como es que se usa, pero averiguate por ahi como se usa y ordenas la lista antes de iterarla porque por razones que no recuerdo el orden de las listas no siempre es el mismo en tiempo de corrida.

salu2!
  #3 (permalink)  
Antiguo 01/07/2010, 11:42
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 10 meses
Puntos: 41
Respuesta: persistiendo una Collection (List)

no.. no es problema de la List (las List, a diferencia de las Set o Collection) mantienen/respetan el orden en que fueron add() los elementos.
la List se mantiene tal cual hasta el momento de hacer el .commit();

Como solución temporal tuve que dejar de lado las "bondades" del orm y persistir individual y primeramente la Factura y después uno a uno los DetalleFacturaVenta con la entidad de Factura..
(que bronca carajo).......

Etiquetas: collection, list, persist, toplink
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:57.