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

Novato con problemas para empezar en Hibernate.

Estas en el tema de Novato con problemas para empezar en Hibernate. en el foro de Java en Foros del Web. Hola a todos. Por motivos laborales estoy ahora empezando con Hibernate y Eclipse. El caso es que la teoría es muy bonita, el concepto lo ...
  #1 (permalink)  
Antiguo 21/04/2009, 02:00
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Novato con problemas para empezar en Hibernate.

Hola a todos.

Por motivos laborales estoy ahora empezando con Hibernate y Eclipse.

El caso es que la teoría es muy bonita, el concepto lo tengo claro pero ahora quería cacharrear un poco pero es imposible, me esta costando horrores hacer un simple "Hola mundo" con Hibernate.

He seguido tutoriales y demás, pero nada, unos no funcionan otros dan problemas,....

Encontré uno ayer que me gusto mucho:
http://code.google.com/p/clubgestion...y&nobtn=Update

y que aparentemente debería funcionar, pero NO es así, da este error, al menos a mi.

Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V

No sé que significa este error, ni por que lo da.

Esto es desesperante.

A ver si alguien me puede echar un cable.

Salu2
  #2 (permalink)  
Antiguo 21/04/2009, 02:05
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Novato con problemas para empezar en Hibernate.

Wenas

Has probado a buscar ese error en san google??

http://forum.springsource.org/showthread.php?t=10617

Saludos.
  #3 (permalink)  
Antiguo 21/04/2009, 02:48
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Puff, en eso estaba.

He actualizado asm y cgi y ahora tengo otro error.

Me dice que hibernate no encuentra un valor inicial para calcular el indice, vamos, es lo que entiendo yo.

Esto suelta la consola:

Código:
     [java] Inicalizando Hibernate
     [java] log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
     [java] log4j:WARN Please initialize the log4j system properly.
     [java] Terminada la inicializacion de Hibernate
     [java] Hibernate: select max(uid) from LIBRO
     [java] org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator
umm..., esto...... ¿hay que crear la tabla antes en HSQL?

Por que.... de donde no hay, dudo que pueda sacar.

Estoy cerca, hoy ni desayunoooo

Gracias, un saludo.
  #4 (permalink)  
Antiguo 21/04/2009, 03:15
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Aquí estoy de nuevo.

Tengo un problema con el indice de la tabla, no consigo que me lo calcule bien.

He probado con:

<generator class="increment"/>

y

<generator class="native"/>

[java] Hibernate: insert into LIBRO (uid, titulo, autor) values (null, ?, ?)
[java] org.hibernate.exception.SQLGrammarException: could not insert: [mx.uam.hibernate.Libro]

¿Qué problema tiene?

Salu2
  #5 (permalink)  
Antiguo 21/04/2009, 03:33
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Esto va a parecer un blog.

En el archivo hibernate.cfg.xml he tenido que cambiar esta línea:

<property name="hibernate.hbm2ddl.auto">update</property>

y poner el valor en create.

Así, ha debido de poder crear la tabla y por tanto insertar, que, supongo, lo ha hecho. (Al menos, no ha dado error).

Ahora estoy intentando recuperar los datos y obtengo una excepción.

La sentencia que vuelca la consola es:
Hibernate: select libro0_.uid as uid0_, libro0_.titulo as titulo0_, libro0_.autor as autor0_ from LIBRO libro0_

y el error:

[java] Exception in thread "main" java.lang.RuntimeException: could not execute query
[java] at mx.uam.hibernate.ManejadorLibro.listaLibros(Maneja dorLibro.java:48)
[java] at mx.uam.hibernate.ManejadorLibro.main(ManejadorLibr o.java:64)

Es raro, el código es de un tutorial, suponía que estaría probado, tengo que investigarlo.

Salu2
  #6 (permalink)  
Antiguo 21/04/2009, 04:07
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Novato con problemas para empezar en Hibernate.

El error anterior te daba porque la tabla no estaba creada.

Que tienes en la linea 48 de manejadorlibro??
  #7 (permalink)  
Antiguo 21/04/2009, 04:34
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

El método que contiene el error es este:

Código:
    private List listaLibros() {
        try {
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            List result = session.find("from Libro");
            tx.commit();
            session.close();
            return result;
        } catch (HibernateException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
Me pasa al intentar recuperar los datos.

De todos modos, no veo muy claro que este bien el archivo de configuración.
Los datos debe insertarlos bien, pero por lo que sea no los encuentra.

Al recuperar debería salir esto:

[java] Hibernate: select libro0_.uid as uid, libro0_.titulo as titulo0_,
libro0_.autor as autor0_ from LIBRO libro0_
[java] Libro: Tutorial, Autor: IngSW

y a mi me sale esto:

[java] Terminada la inicializacion de Hibernate
[java] Hibernate: select libro0_.uid as uid0_, libro0_.titulo as titulo0_, libro0_.autor as autor0_ from LIBRO libro0_

Es decir, la línea del system.out no sale, ¿why?
El caso es que ahora no obtengo ningún error, el de antes debía ser por jugar con el fichero de configuración, con esta línea:

<property name="hibernate.hbm2ddl.auto">create</property>

La he dejado así, por que funciona, si la pongo en update, sale el error de antes.

Me huele fatal que no exista un valor en plan "automatic" para crear, insertar, modificar... etc, vamos, que se me esta pasando algo por alto.

Salu2
  #8 (permalink)  
Antiguo 21/04/2009, 05:00
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Lo que pasa es que no recupero nada de nada :D

Cita:
List result = session.createQuery("from Libro").list();

System.out.println("Tamaño libreria: " + result.size());
Obtengo un 0 patatero.

¿Cómo sé que inserto correctamente? Podría ver los datos en alguna consola? Uso eclipse.


Edito: He abierto el "Manager" de HSQL y al ejecutar el proyecto, no se crea ninguna tabla. He creado yo mismo la tabla y no inserto ni recupero valores.

Es como si no conectase ó si conecta yo no me estoy conectando al mismo sitio...... es muy raro.



Salu2

Última edición por NeoKaisser; 21/04/2009 a las 05:59
  #9 (permalink)  
Antiguo 21/04/2009, 06:17
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Novato con problemas para empezar en Hibernate.

En tu cfg.xml de turno tienes la cadena de conexion. Es ahi donde se conecta.

Lo que me desconcierta y bastante es lo que comentaste de cambiar <property name="hibernate.hbm2ddl.auto">update</property>
a create, es decir, el esquema de BBDD no existia.

A ver si estas conectandote a otro esquema con HSQL...

Saludos.
  #10 (permalink)  
Antiguo 21/04/2009, 06:23
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Este es mi cfg:

Código:
	<session-factory>
		<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
		<property name="hibernate.connection.url">jdbc:hsqldb:data/test</property>
		<property name="hibernate.connection.username">sa</property>
		<property name="hibernate.connection.password"></property>
		<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
		<property name="show_sql">true</property>
		<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
		<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
		<property name="hibernate.hbm2ddl.auto">create</property>
		<mapping resource="mx/uam/hibernate/data/Libro.hbm.xml"/>
	</session-factory>

Así cuando le digo mediante un parametro de ant que inserte, dice que lo hace y cuando le digo que recupere, no recupera, puesto que el objeto devuelto esta vacío.

He probado a poner otras url para la conexión, pero no .... no sucede nada.

¿No debería soltar un error si no inserta nada?
¿Cómo compruebo que esta parte funciona?

Salu2
  #11 (permalink)  
Antiguo 21/04/2009, 09:01
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Acabo de comprobar que si inserto y a continuación accedo a los datos... el invento funciona.

¿Será algún problema con la base de datos hsql? Bueno, con la tabla. Un compañero esta haciéndolo con MySQL y le funciona bien " haciéndolo todo seguido".

Puff, es difícil explicar todo en un post.

Si alguien tiene un tutorial sencillo no dude en recomendarmelo.

Salu2 y gracias
  #12 (permalink)  
Antiguo 21/04/2009, 12:03
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Novato con problemas para empezar en Hibernate.

Cita:
Iniciado por NeoKaisser Ver Mensaje
Acabo de comprobar que si inserto y a continuación accedo a los datos... el invento funciona.
Eso suena a que no se ha hecho un flush de la sesión o algo así, por lo que en realidad no se guardan los datos. A veces con el commit no basta.

De lo de crear las tablas no te puedo decir mucho, ya que yo siempre creo el esquema de BDD de forma independiente, ya que no me gusta depender del ORM para eso.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #13 (permalink)  
Antiguo 22/04/2009, 00:05
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Hola de nuevo.

He añadido un flus antes y después del commit y nada

¿Será por que es una base de datos en memoria?

Aquí os dejo mi clase, a ver si veís algo raro. (Aunque esta en el tutorial de arriba, todo, es lo único que he usado).

Código:
package mx.uam.hibernate;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class ManejadorLibro {
    private SessionFactory sessionFactory;

    public ManejadorLibro() {
        try {
            System.out.println("Inicalizando Hibernate");
            sessionFactory = new Configuration().configure().buildSessionFactory();
            System.out.println("Terminada la inicializacion de Hibernate");
        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }

    private void agregaLibro(String titulo, String autor) {
        try {
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            Libro libro = new Libro();
            libro.setTitulo(titulo);
            libro.setAutor(autor);
            System.out.println("Valores a insertar " + autor + ", " + titulo);
            session.save(libro);
            session.flush();
            tx.commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }

    private List listaLibros() {
        try {
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            // List result = session.find("from Libro");
            List result = session.createQuery("from Libro").list();

            System.out.println("Tamaño libreria:  " + result.size());

            tx.commit();
            session.close();
            return result;
        } catch (HibernateException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

    public static void main(String[] args) {
        ManejadorLibro manejadorLibro = new ManejadorLibro();

        // System.out.println("__| Parametros: " + args[0] + ", " + args[1] + " ," + args[2] + " __|");

        if (args[0].equals("agrega")) {
            if (args[1] != null && args[2] != null) {
                manejadorLibro.agregaLibro(args[1], args[2]);

            } else {
                System.out.println("Faltan parametros");
            }
        } else if (args[0].equals("lista")) {
            List libros = manejadorLibro.listaLibros();

            for (int i = 0; i < libros.size(); i++) {
                Libro libro = (Libro) libros.get(i);
                System.out.println("Libro: " + libro.getTitulo() + ", Autor:" + libro.getAutor());
            }
        }
        System.exit(0);
    }
}

Si modifico el main, insertando y recuperando los datos a continuación, si funciona, de este modo:

Código:
public static void main(String[] args) {
        ManejadorLibro manejadorLibro = new ManejadorLibro();

        // System.out.println("__| Parametros: " + args[0] + ", " + args[1] + " ," + args[2] + " __|");

        if (args[0].equals("agrega")) {
            if (args[1] != null && args[2] != null) {
                manejadorLibro.agregaLibro(args[1], args[2]);
                List libros = manejadorLibro.listaLibros();

                for (int i = 0; i < libros.size(); i++) {
                    Libro libro = (Libro) libros.get(i);
                    System.out.println("Libro: " + libro.getTitulo() + ", Autor:" + libro.getAutor());
                }

            } else {
                System.out.println("Faltan parametros");
            }
        } else if (args[0].equals("lista")) {
            List libros = manejadorLibro.listaLibros();

            for (int i = 0; i < libros.size(); i++) {
                Libro libro = (Libro) libros.get(i);
                System.out.println("Libro: " + libro.getTitulo() + ", Autor:" + libro.getAutor());
            }
        }
        System.exit(0);
    }


¿Por qué?

¿Hay alguna propiedad del "cfg" que indique que los datos "no persistan" ?? no sé, ya no sé donde buscar.

Salu2 y gracias.
  #14 (permalink)  
Antiguo 22/04/2009, 02:30
 
Fecha de Ingreso: julio-2003
Mensajes: 240
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Novato con problemas para empezar en Hibernate.

Hola de nuevo.

Seguro que me nombran pesado del foro

He intentado instalar MySQL en Vista y .... he desistido, error con el puerto,... una basura.

Así que recordé que el tutorial al que hago referencia en el primer post, después del ejemplo con HSQL, hace otro, igual, para Derby.

Derby: Bajo el driver, configuro un par de líneas,....., ejecuto y funciona todo a la primera. Increíble.

Funciona bien y por separado. Abro, inserto y cierro. Abro, consulto y cierro. Todo correcto.

Algún tipo de configuración especial debe necesitar HSQL para que esto funcione correctamente.

UN SALUDO Y GRACIAS POR LA AYUDA.

Pd: De todos modos, el tutorial es BUENISIMO. Lo recomiendo.
  #15 (permalink)  
Antiguo 22/04/2009, 04:05
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Novato con problemas para empezar en Hibernate.

Quizá es que has usado HSQLDB en modo "solo memoria". Como su nombre indica, cuando apagas la JVM, todo se borra. Se usa solo para BDD temporales en algunos entornos. Quizá la que querias usar es el modo en que todo se almacena despues en ficheros, como Derby.

Por que yo uso bastante HSQDLB y no he tenido ese problema.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
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 10:34.