Veamos, estoy usando EclipseLink (JPA 2.0) y una base de datos Apache Derby embebida.
Básicamente, lo que necesito es crear (muchos) otros objetos a partir de una lista de la entidad Curso. En este proceso de creación, siempre voy a usar la lista de cursos original, es decir, no necesito (y no quiero, por un tema de eficiencia) consultar una y otra vez a la base de datos para que me devuelva la misma lista. Quiero usar siempre la misma instancia para generar mis otros objetos.
Para esto, uso el patrón Singleton:
Código Java:
Hasta ahí todo bien, sólo hace la consulta a la base de datos la primera vez (cuando listaCursos es nulo).Ver original
// Método Singleton private List<Curso> listaCursos; public List<Curso> getListaCursos() throws DaoException { if ( listaCursos == null ) { listaCursos = new CursoDao().traerTodos(); } return listaCursos; }
El problema viene a continuación:
Creo un List de la entidad Curso llamado listaCursos1 y en esta lista guardo la lista de cursos.
Código Java:
Itero la listaCursos1, le hago algunos cambios (le "seteo" otras valores a sus atributos).Ver original
// Instancia lista de cursos List<Curso> listaCursos1; listaCursos1 = Utilitarios.getInstance().getListaCursos();
Creo una nueva lista de cursos llamada listaCursos2.
Código Java:
Ahora, pasa que la listaCursos2 no es igual a lista original (la del patrón singleton, la que viene de la base de datos), sino que es igual a la listaCursos1. Todos los cambios que he realizado a la listaCursos1 se han realizado también sobre la listaCursos original. ¿Por qué pasa eso?Ver original
// Instancia nueva lista de cursos List<Curso> listaCursos2; listaCursos2 = Utilitarios.getInstance().getListaCursos();
Adjunto el método que me devuelve la lista de cursos desde la base de datos.
Código Java:
El EntityManager se cierra al finalizar y se manejan las excepciones.Ver original
// Método que devuelve la lista de todos los cursos public List<Curso> traerTodos() throws DaoException { em = getEntityManager(); List<Curso> cursos; try { Query q = em.createQuery("SELECT c FROM Curso c ORDER BY c.codigo ASC"); cursos = q.getResultList(); logger.log(Level.INFO, "Lista de cursos devuelta satisfactoriamente ({0})", cursos.size()); logger.log(Level.WARNING, ex.getMessage(), ex); throw new DaoException("Error al traer Lista de Cursos:" + ex.getMessage(), ex); } finally { if (em != null && em.isOpen()) { em.close(); } } return cursos; }
Acá un pequeño ejemplo de mi problema:
Código Java:
Ver original
// Ejemplo try { FactoryDao factoryDao = new FactoryDao(); List<Curso> listaCursos1; listaCursos1 = Utilitarios.getInstance().getListaCursos(); // Hago algunos cambios sobre la listaCursos1 listaCursos1.remove(0); // Creo una nueva lista List<Curso> listaCursos2; listaCursos2 = Utilitarios.getInstance().getListaCursos(); // La (nueva) lista 2 refleja los cambios que se le hicieron a la lista 1. e.printStackTrace(); } }
Y no entiendo por qué pasa eso, ¿qué podría hacer para salvar esta situación?
Gracias por su atención, espero ansioso sus observaciones.