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

[SOLUCIONADO] Hibernate no pasa los datos

Estas en el tema de Hibernate no pasa los datos en el foro de Java en Foros del Web. Hola, Soy nuevo en hibernate, pero creo que he seguido correctamente el manual de configuración. Este es el archivo hibernate.cfg.xml: Código: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
  #1 (permalink)  
Antiguo 12/05/2013, 11:52
Avatar de fpalomar  
Fecha de Ingreso: noviembre-2003
Mensajes: 123
Antigüedad: 21 años
Puntos: 3
Hibernate no pasa los datos

Hola,

Soy nuevo en hibernate, pero creo que he seguido correctamente el manual de configuración.

Este es el archivo hibernate.cfg.xml:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>

		<!-- Database connection settings -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/bbw</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>

		<!-- JDBC connection pool (use the built-in) 
		<property name="connection.pool_size">1</property> -->

		<!-- SQL dialect 
		<property name="dialect">org.hibernate.dialect.HSQLDialect</property> -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

		<!-- Enable Hibernate's automatic session context management -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Transaction properties -->
		<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>

		<!-- Echo all executed SQL to stdout -->
		<property name="show_sql">true</property>
		
		<mapping resource="Usuario.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
El arcvhivo que representa la clase de java a mapear es:

Código:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 28, 2012 4:05:29 PM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
	<class name="registrar.model.Usuario" table="usuario" catalog="bbw">
		
		<id name="usuario" type="string">
			<column name="usuario" />
			<generator class="assigned" />
		</id>
		
		<property name="nombre" type="string">
			<column name="nombre" length="15" />
		</property>
		
		<property name="apellido" type="string">
			<column name="apellido" length="10" />
		</property>
		
		<property name="NIFCIF" type="string">
			<column name="NIFCIF" length="9" />
		</property>
		
		<property name="email" type="string">
			<column name="email" length="30" />
		</property>
		
		<property name="telefono" type="string">
			<column name="telefono" length="9" />
		</property>
		
		<property name="empresa" type="string">
			<column name="empresa" length="15" />
		</property>
		
		<property name="departamento" type="string">
			<column name="departamento" length="10" />
		</property>
		
		<property name="contrasena" type="string">
			<column name="contrasena" length="15" />
		</property>

	</class>
</hibernate-mapping>
El problema es que en la base de datos no inserta ninguno, lo puedo ver en la consola por que pone:

Código:
Hibernate: insert into bbw.usuario (nombre, apellido, NIFCIF, email, telefono, empresa, departamento, contrasena, usuario) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
¿Me he olvidado de algo?

Saludos
  #2 (permalink)  
Antiguo 12/05/2013, 21:10
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hibernate no pasa los datos

La configuración solo no vale. Ayudaría si pones el código donde haces la inserción.
Eso que pone en la consola es precisamente que está haciendo un insert.
El SQLDialect del fichero de configuración tiene que ser uno, o bien HSQLDialect, o bien MySQLDialect, pero no ambos a la vez.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 13/05/2013, 00:45
Avatar de fpalomar  
Fecha de Ingreso: noviembre-2003
Mensajes: 123
Antigüedad: 21 años
Puntos: 3
Respuesta: Hibernate no pasa los datos

Hola,

En el SQL dialect sólo hay uno, si te fijas el primero està comentado junto con el título, lo que pasa es que aquí es un poco más difícil de ver.

El codigo que hace la inserción supongo que te refieres a la clase.

Esta es la clase de manejo de sesión o session factory, creo que se dice:

Código:
package utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
	private static final SessionFactory sessionFactory;
	static {
		try {
			// Create the SessionFactory from standard (hibernate.cfg.xml)
			// config file.
			Configuration configuration = new Configuration();
			configuration = configuration.configure();
			ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
					.applySettings(configuration.getProperties())
					.buildServiceRegistry();
			sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		} catch (Throwable ex) {
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}
Esta es la que se encarga de coger los datos de la clase que quiero hacer persistente para pasarlos a la base de datos del mySQL:

Código:
package utils;

import org.hibernate.Session;
import registrar.model.Usuario;

public class Traspasar {
	
	public static void datos(String nombre, String apellido, String nifcif, String email,
			String telefono, String empresa, String departamento, String usuario, String contrasena) {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        Usuario us = new Usuario();
       
        us.setNombre(nombre);
        us.setApellido(apellido);
        us.setNIFCIF(nifcif);
        us.setEmail(email);
        us.setTelefono(telefono);
        us.setEmpresa(empresa);        
        us.setDepartamento(departamento);
        us.setUsuario(usuario);
        us.setContrasena(contrasena);
        //System.out.println("classe Traspasar.java" + us.toString());//
        session.save(us);
        session.flush();
        session.close();
	}

}
He remarcado la salida por consola que he puesto, era para comprobar si ahí había datos y para mi sorpresa si que los había. La he dejado como comentario.

Un saludo chuidiang!
  #4 (permalink)  
Antiguo 13/05/2013, 01:17
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Hibernate no pasa los datos

envuelve ese codigo en un bloque try-catch y mira si salta alguna excepción en las ultimas 3 lineas.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 13/05/2013, 01:47
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 8 meses
Puntos: 78
Respuesta: Hibernate no pasa los datos

Yo creo que te falta el objeto Transaction para hacer el commit().

Saludos
  #6 (permalink)  
Antiguo 13/05/2013, 08:11
Avatar de fpalomar  
Fecha de Ingreso: noviembre-2003
Mensajes: 123
Antigüedad: 21 años
Puntos: 3
Respuesta: Hibernate no pasa los datos

Hola,

Tal y como indica ElAthlit me falta el Transaction y luego el .commit. Creo que los ejemplos que he utilizado como guia no son del todo buenos.

Estaba utilizando estos como ejemplos:

http://dracof.blogspot.com.es/2009/1...hibernate.html

http://www.davidmarco.es/tutoriales/...rstapp-mapping

Pero he encontrado este aunque no me entero mucho.

http://www.crazyteam.es/java/persist...ernate-basico/

Saludos
  #7 (permalink)  
Antiguo 13/05/2013, 08:58
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 8 meses
Puntos: 78
Respuesta: Hibernate no pasa los datos

Añade a tu código entonces lo siguiente:

1.- Transaction tx = session.beginTransaction(); ---> Antes de crear el objeto Usuario

2.- tx.commit(); ---> despues de hacer el session.save(us);

Saludos
  #8 (permalink)  
Antiguo 13/05/2013, 11:48
Avatar de fpalomar  
Fecha de Ingreso: noviembre-2003
Mensajes: 123
Antigüedad: 21 años
Puntos: 3
Respuesta: Hibernate no pasa los datos

Hola,

Gracias, gracias ya me funciona, pero ahopra tengo una duda ¿para saber si tengo un usuario repetido que es mejor?
- Hacer antes una consulta y si no esta repetido hago el Transaction.

- Capturar la excepcion que es del tipo:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Duplicate entry 'fplcenta' for key 'PRIMARY'

Aunque luego creo que estaria un poco perdido, por que no estoy seguro de si seria como pongo a continuacion:

e.printStackTrace(); lo modifico porque monto lo siguiente:

Código:
String anotherString = new String("Duplicate entry " + usuario + "for key 'PRIMARY'");
e.getMessage().compareTo(anotherString);
Y luego averiguar como enviar un mensaje al usuario que se ha registrado, supongo que lo mejor seria una ventana jsp del tipo popup.

¿Qué opinais?

Saludos
  #9 (permalink)  
Antiguo 14/05/2013, 01:50
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 8 meses
Puntos: 78
Respuesta: Hibernate no pasa los datos

Hola fpalomar,
para saber si tienes un usuario repetido, yo lo que haría es hacer una consulta, una vez sepas si está repetido o no ya haces lo que más te convenga.

Las excepciones deben tratarse como eso, excepciones, es decir cosas que pueden ocurrir de forma excepcional para controlar un problema o error. Si puedo saber de una forma limpia si hay un usuario en la BBDD, mejor hacer la consulta. Otro caso es que fuera complejo saber si un usuario ya está en la base de datos, en ese caso sería más conveniente hacer uso de las excepciones (para tratarla y salvar el programa).

Saludos

Etiquetas: hibernate, j2ee, struts2
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 08:26.