Bucles infinitos usando @PreUpdate

Ayuda
Arturo
2012-03-21
2012-11-26
  • Arturo
    Arturo
    2012-03-21

    Hola!!!!,
    a ver, tengo un método para el calculo de pesos declarado con un @PreUpdate que tiene esta pinta

        @PreUpdate
        public void calculaPeso(){
            List pesos=null;
            try{
                pesos = XPersistence.getManager().createQuery(
                    "select i from LinCalibrados i"
                            + " where i.idTrabajo = "+this.idTrabajo).getResultList();
            }catch(Exception e){
                e.printStackTrace();
            }
            float totalPesos = 0;
            for (int i = 0; i < pesos.size(); i++) {
                totalPesos = totalPesos
                        + ((LinCalibrados) pesos.get(i)).getPesoTotal();
            }
            pesoTotal= totalPesos; // Devuelve el último
        }
    

    pero cuando llega a la línea

    pesos = XPersistence.getManager().createQuery(
                    "select i from LinCalibrados i"
                            + " where i.idTrabajo = "+this.idTrabajo).getResultList();
    

    Vuelve al principio como si volviera a saltar el evento de PreUpdate y así continúa hasta dar un StackOverflow.
    Podría enteder que si intento modificar la entidad pues volviera a saltar, pero solo es una select, y además ni siquiera es sobre la entidad que tiene el @PreUpdate.

    IDEAS???????

    Saludos

     
  • Saludos Arturo:

    En las especificaciones de JPA el utilizar la persistencia durante uno de sus "callbacks" no es aconsejable.

    pero solo es una select

    Eso puede estarlo causando Hibernate ya que puede estar provocando un AutoFlush de las entidades con actualizaciones pendientes.

    IDEAS???????

    Primero trata XPersistence.createManager() para que tengas otro contexto de persistencia no asociado al actual. Si esto no te funciona, trata con un native query para ver si el auto flush no se dispara.

    Espero te sea util,

    Federico

     
  • Arturo
    Arturo
    2012-03-23

    Muchísimas Gracias Federico. Probaré a ver.

     
  • Arturo
    Arturo
    2012-03-23

    Perfecto! ha funcionado muy bien. He cambiado el getManager por el createManager y no he tenido mas problemas. Muchas gracias Federico.