Foros del Web » Programación para mayores de 30 ;) » Java »

Hibernate se cuelga en medio de una transaccion

Estas en el tema de Hibernate se cuelga en medio de una transaccion en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/07/2011, 12:40
Avatar de Payin  
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 17 años
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.
  #2 (permalink)  
Antiguo 13/07/2011, 08:11
 
Fecha de Ingreso: diciembre-2010
Mensajes: 459
Antigüedad: 13 años, 4 meses
Puntos: 21
Respuesta: Hibernate se cuelga en medio de una transaccion

Yo no se mucho de esto pero una pregunta, cuando haces esto:

pSrv.guardar(todosLosPartidos);

todosLosPartidos solo esta instanciado, en ninguna liena veo que le pases parametros al:

List<Partido> todosLosPartidos = new ArrayList<Partido>();

A lo mejor es por eso que te falla

PD: estas siguiendo algun manual? podrias compartirlo, es que me gustaria aprender spring

Saludos
  #3 (permalink)  
Antiguo 13/07/2011, 12:45
Avatar de Payin  
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 17 años
Puntos: 0
Respuesta: Hibernate se cuelga en medio de una transaccion

Hola, gracias por responder/preguntar. Ese guardar todos los partidos fue una prueba para ver si usando el save all de hibernate me andaba, pero tampoco. Ahora lo edito.

La verdad que no sigo ningún manual, voy leyendo a medida que me encuentro con inquietudes grandes o errores de ejecución. Yo recomiendo leer la doc de spring en su pagina. Si es posible lo de spring 2.5.4 para adelante, por el tema de que hay cosas que ya no se usan que siguen siendo convenciones para los que se quedaron con versiones viejas.

Los xml de configuración los veo de ejemplos o del mismo manual de spring y lo voy modificando a medida que me salta alguna duda.

Bueno, gracias de todas formas y cualquier consulta no hay problema!

Etiquetas: hibernate, spring
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:14.