Tema: Duda con JPA
Ver Mensaje Individual
  #3 (permalink)  
Antiguo 11/12/2012, 09:18
Avatar de farfamorA
farfamorA
 
Fecha de Ingreso: noviembre-2010
Ubicación: Lima
Mensajes: 136
Antigüedad: 13 años, 5 meses
Puntos: 24
Respuesta: Duda con JPA

Hola Fuzzylog, gracias por responder.
Implementé tus recomendaciones y mi método singleton quedó así:
Código Javascript:
Ver original
  1. // Método singleton
  2.     private List<Curso> getListaCursos() throws DaoException {
  3.         if ( listaCursos == null ) {
  4.             listaCursos = new CursoDao().traerTodos();
  5.         }
  6.         List<Curso> nuevaLista = new ArrayList<Curso>();
  7.         for (Iterator<Curso> it = listaCursos.iterator(); it.hasNext();) {
  8.             Curso curso;
  9.             curso = it.next();
  10.             nuevaLista.add(curso);
  11.         }
  12.         return nuevaLista;
  13.     }
Gracias a esta modificación, el método del ejemplo anterior ahora arroja los resultados esperados. Remuevo el primer elemento de listaCursos1, y la listaCursos2 aparece completa.
Output:
Código:
Lista Original: [960001, 960002, 960003, 960004, 960005]
Lista Cursos 1: [960002, 960003, 960004, 960005]
Lista Cursos 2: [960001, 960002, 960003, 960004, 960005]

Pero el panorama cambia cuando no remuevo, sino cuando "seteo" nuevos valores a sus atributos. Pero en este punto me he dado cuenta que no tiene nada que ver con JPA. Cuando completo la listaCursos "manualmente", es decir, sin hacer consulta a la base de datos, también tengo ese problema.
Ejemplo 2.
Código Javascript:
Ver original
  1. //
  2.     private List<Curso> listaCursosManual;
  3.    
  4.     // Método que devuelve una Lista de Cursos, completados de manera "manual"
  5.     // Hace las veces de la consulta a la base de datos
  6.     private List<Curso> popularListaCursos() {
  7.         List<Curso> lista;
  8.         lista = new ArrayList<Curso>();
  9.         Curso curso;
  10.         for (int i = 1; i < 6; i++) {
  11.             curso = new Curso(i);
  12.             curso.setCodigo("96000"+i);
  13.             lista.add(curso);
  14.         }
  15.         return lista;
  16.     }
  17.     // Método patrón Singleton
  18.     private List<Curso> getListaCursosManual() throws DaoException {
  19.         if ( listaCursosManual == null ) {
  20.             listaCursosManual = popularListaCursos();
  21.         }
  22.         List<Curso> nuevaLista = new ArrayList<Curso>();
  23.         for (Iterator<Curso> it = listaCursosManual.iterator(); it.hasNext();) {
  24.             Curso curso;
  25.             curso = it.next();
  26.             nuevaLista.add(curso);
  27.         }
  28.         return nuevaLista;
  29.     }    
  30.     // Ejemplo
  31.     public static void main(String[] args) {
  32.         try {
  33.             List<Curso> listaCursos1;
  34.             listaCursos1 = Utilitarios.getInstance().getListaCursosManual();
  35.             System.out.println("Lista Original: " + listaCursos1);
  36.             // Hago algunos cambios sobre la listaCursos1
  37.             listaCursos1.get(0).setCodigo("XXXXXX");
  38.             System.out.println("Lista Cursos 1: " + listaCursos1);
  39.  
  40.             // Creo una nueva lista
  41.             List<Curso> listaCursos2;
  42.             listaCursos2 = Utilitarios.getInstance().getListaCursosManual();
  43.  
  44.             // La (nueva) lista 2 refleja los cambios que se le hicieron a la lista 1.
  45.             System.out.println("Lista Cursos 2: " + listaCursos2);
  46.        
  47.         } catch (Exception e) {
  48.             e.printStackTrace();
  49.         }
  50.     }
Output:
Código:
Lista Original: [960001, 960002, 960003, 960004, 960005]
Lista Cursos 1: [XXXXXX, 960002, 960003, 960004, 960005]
Lista Cursos 2: [XXXXXX, 960002, 960003, 960004, 960005]

No me doy cuenta dónde lo estoy haciendo mal...
Muchas gracias por su tiempo.