El problema es el siguiente (trataré de explicarlo lo mas sencillo posible): supongamos que tengo 3 entidades... Persona, Carpeta, Papeles...
Papeles tiene el id de carpeta y carpeta de persona... (los papeles son ya definidos para cada tipo de persona, por ejemplo, persona "x" tiene 10 papeles y persona "y" 15) tienen un estado de completo e incompleto)
En la pantalla de guardar la carpeta, aparecen los papeles que le corresponden y se los coloca como completos e incompletos a cada uno... al guardar necesito que se vea si ya están todos los papeles de la persona como completos y coloque en Persona, en un campo específico, completo o incompleto... (aclaro que se deben de guardar siempre los estados de los papeles, por lo tanto, por ejemplo, si una persona tiene asignados 10 papeles, podria al final haber un total de x estados por papel, o sea, el papel 1 podria tener 10 estados incompletos y luego un completo, así como una persona puede tener varias carpetas).
Entonces, lo que hago al guardar la carpeta es contar la cantidad de papeles que tiene asignada esa persona, cuento la cantidad de papeles completos de la persona, los comparo y si son iguales está completo.
El problema es que, como en la misma transacción hago todo, o sea, guardo la carpeta con los estados de los papeles, hago las comparaciones y guardo, aparte de la carpeta, la persona con su estado de completo o incompleto, no me trae la carpeta que guardé a la hora de hacer el conteo.
Paso el código lo más simple posible:
public void create(Carpeta entity) throws RuntimeException {
EntityManager em = emf.createEntityManager();
try{
em.getTransaction().begin();
em.joinTransaction();
em.persist(entity);
em.flush();
em.refresh(entity);
PersonaFacade pf = new PersonaFacade();
pf.setEstadoPersona(em,carpeta.getPersona());
em.getTransaction().commit();
} catch(Exception ex){
System.err.println("Error al persistir " + entity.getClass() + ": " + ex);
try {
em.getTransaction().rollback();
} catch (Exception e) {
throw new RuntimeException("Error al persistir " + entity.getClass() + ": " + e.getMessage(), e);
}
throw new RuntimeException("Error al persistir " + entity.getClass() + ": " + ex.getMessage(), ex);
} finally {
em.close();
}
como se habrán dado cuenta, se llama a una función setEstadoPersona que se encuentra en la clase PersonaFacade, paso ese código:
public void setEstadoPersona(EntityManager em, Persona p) {
List<Papeles> result = new ArrayList();
result = em.createQuery("SELECT o FROM Papeles o WHERE o.carpeta.Persona = :P")
.setParameter("P", p)
.getResultList();
Long cantPapeles = (Long) em.createQuery("SELECT count(o) FROM RequisitoPersona o WHERE o.grupoPersona = :G")
.setParameter("G", p.getGrupoPersona())
.getSingleResult();
int i = 0;
for(Papeles pap : result){
if(pap.getEstadoPapel() == EstadoPapel.COMPLETO) i++;
}
if(i == cantPapeles){
p.setEstado(EstadoPapel.COMPLETO);
} else p.setEstado(EstadoPapel.INCOMPLETO);
em.persist(em.merge(p));
}
Se habrán fijado que existen 2 entidades más, RequisitoPersona y GrupoPersona... no se preocupen por esa parte, es que las personas tienen grupos con requisitos, los cuales dictan la cantidad de papeles que tienen... esa parte funciona porque no se altera con la carga de carpetas... lo que no funciona es la consulta anterior, la que sirve para saber cuantos papeles completos tiene, porque trae de las carpetas ya guardadas pero no la de la guardada en esa transacción, o sea, si tenía ya 3 papeles completos de 10 y en ésta carga guardé 7 como completos (en total, 10 completos), debería de guardar ya el estado como completo, pero no es así, imprimi la variable "i" luego del "for" y me trae la cantidad anterior, para el ejemplo, 3, no 10.
Disculpen si me explayé mucho...