Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/07/2011, 12:40
Avatar de Payin
Payin
 
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 17 años, 6 meses
Puntos: 0
Hibernate se cuelga en medio de una transaccion

Hola comunidad, estoy teniendo un problema al guardar en una aplicación, pero no al guardar por primera vez, sino que luego de guardar (dentro de un loop o con un saveAll) unas 3 o 4 veces, el programa deja de funcionar y queda en un estado de stand by.

Mi aplicación la estoy haciendo con Spring 3.0.0 e Hibernate 3.2. En todo los casos guarda, recupera y elimina perfectamente, pero en ete método donde tengo que guardar reiteradas veces se me cuelga la ejecución. Si lo debugueo me queda en ese línea de ejecucion (el save) y me desaparecen los valores de las variables en ejecucion. He probado capturar excepcion, pero no me devuelve ningun tipo de excepcion.

La verdad que no se qué más probar.

Les dejo el método que guarda:

Código:
@Transactional
    public void guardar(T objeto) throws DataAccessException {
	try {
	    getHibernateTemplate().saveOrUpdate(objeto);
	} catch (Exception e) {
	    System.err.println(e.getCause());
	    e.printStackTrace();
	    System.err.println(e.getMessage());
	}
    }
Y el método desde donde lo llamo:

Código:
@Override
    @Transactional
    public void generarFixture(Categoria c) throws MensajeDeExcepcion {

	if (fSrv.getFechasDeCategoria(c.getIdCategoria()) != null) {
	    
	    List<Partido> todosLosPartidos = new ArrayList<Partido>();
	    

	    List<Equipo> equipos = this.getEquipos(c);
	    Random r = new Random(System.currentTimeMillis());
	    Collections.shuffle(equipos, r);

	    List<Equipo> equiposLocales = new ArrayList<Equipo>(equipos);
	    List<Equipo> equiposVisitantes = new ArrayList<Equipo>(equipos);
	    final int CANT_EQUIPOS = equiposLocales.size();

	    final Equipo ultimo = equiposLocales.remove(CANT_EQUIPOS - 1);

	    equiposVisitantes.remove(CANT_EQUIPOS - 1);

	    for (int fila = 0; fila < CANT_EQUIPOS - 1; fila++) {

		Fecha f = new Fecha();

		f.setCategoria(c);
		f.setNumeroFecha(fila + 1);
		f.setPartidos(new ArrayList<Partido>());

		Estado estado = eSrv.getEstadoByNombreAndObjeto("Activo", "Partido");

		logger.info("*****");
		logger.info("Fecha " + (fila + 1));
		
		fSrv.guardarFecha(f);

		for (int col = 0; col < CANT_EQUIPOS / 2; col++) {

		    Equipo eqVisitante;
		    Equipo eqLocal;

		    if (col == 0) {
			if (fila % 2 == 0) {
			    eqVisitante = equiposLocales.remove(0);
			    eqLocal = ultimo;
			    equiposLocales.add(eqVisitante);
			} else {
			    eqLocal = equiposLocales.remove(0);
			    eqVisitante = ultimo;
			    equiposLocales.add(eqLocal);
			}
		    } else {
			eqLocal = equiposLocales.remove(0);
			eqVisitante = equiposVisitantes.remove(equiposVisitantes.size() - 1);

			equiposLocales.add(eqLocal);
			equiposVisitantes.add(0, eqVisitante);
		    }

		    Partido p = new Partido();
		    p.setFecha(f);
		    p.setEquipoLocal(eqLocal);
		    p.setEquipoVisitante(eqVisitante);
		    p.setCategoria(c);
		    p.setEstado(estado);

		    logger.info("Partido " + (col + 1) + " " + eqLocal.getNombre() + " vs "
			    + eqVisitante.getNombre());

		    pSrv.guardar(p);

		}
	    }
	    
	    pSrv.guardar(todosLosPartidos);

	} else {
	    throw new MensajeDeExcepcion("La categoria ya tiene fechas");

	}
    }


Al momento de guardar (antes de que se "cuelgue") el hibernateTemplate en el debug tiene estos valores:

Código HTML:
hibernateTemplate	HibernateTemplate  (id=113)	
	allowCreate	true	
	alwaysUseNewSession	false	
	beanFactory	null	
	cacheQueries	false	
	checkWriteOperations	true	
	defaultJdbcExceptionTranslator	null	
	entityInterceptor	null	
	exposeNativeSession	false	
	fetchSize	0	
	filterNames	null	
	flushMode	1	
	jdbcExceptionTranslator	null	
	logger	Log4JLogger  (id=121)	
	maxResults	0	
	queryCacheRegion	null	
	sessionFactory	SessionFactoryImpl  (id=122)
edit:

Me olvidaba de comentar, el método save que puse anteriormente lo uso tanto para fecha como para partido. Los DAO's de cada uno lo utilizan, ya que es genérico.