lunes, 19 de septiembre de 2011

Crear proyecto Maven + Hibernate

Vamos a crear un proyecto Hibernate con Maven.

 Crear proyecto con maven 2 :

mvn archetype:create -DgroupId=com.ejemplo -DartifactId=hibernate

Generar los archivos necesarios para importar el proyecto a eclipse:

mvn eclipse:eclipse

Importar el proyecto desde eclipse : File –> Import –> General

Crear una carpeta resurces en src/main de tal forma que el path quede así: src/main/resources

Abrir el pom y agregar las dependencias de hibernate y mysql y además plugins para que compile con java 1.6, plugin de java doc y plugin de reportes.

El pom debería quedar así:

	4.0.0

	com.ejemplo
	hibernate
	1.0-SNAPSHOT
	jar

	hibernate
	http://maven.apache.org

	
		UTF-8
	

	
		
			
				maven-compiler-plugin
				
					1.6
					1.6
				
			
			
				org.apache.maven.plugins
				maven-javadoc-plugin
			
			
				org.apache.maven.plugins
				maven-project-info-reports-plugin
			
		
	

	

		
			junit
			junit
			4.8.2
			test
		

		
		
			mysql
			mysql-connector-java
			5.1.9
		

		
		
			org.hibernate
			hibernate-core
			3.6.3.Final
		
 
		
			javassist
			javassist
			3.12.1.GA
		

	


Hacer mvn clean install y mvn eclipse:eclipse. Refrescar el proyecto en eclipse para que tome los cambios.

Generar clase y su mapeo:

Creeamos una clase persona:

package com.ejemplo;

/**
 * @author emanuel
 *
 */
public class Persona {
	
	private Long id;
	
	private String nombre;
	
	private String apellido;

	public Persona(String nombre, String apellido) {
		super();
		this.nombre = nombre;
		this.apellido = apellido;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
	
	//Constructor usado por hibernate
	protected Persona() {	}

}
Ahora creamos el archivo de mapeo, el cual es un archivo .xml el cual es deseable (no obligatorio) que se llame igual que la clase que mapea y se encuentre en la carpeta resources con la estructura de paquete que tiene la clase, por lo tanto el path sería:

main/resources/com/ejemplo/persona.hbm.xml y el archivo sería como el siguiente:


    
        
            
            
        
        
            
        
        
            
        
    


Configurar hibernate:

Para configurar hibernate es necesario generar un archivo hibernate.cfg.xml y guardarlo en la carpeta resources. Este archivo contendra la siguiente información:


 
  com.mysql.jdbc.Driver
  jdbc:mysql://localhost:3306/prueba
  root
  
  update
  org.hibernate.dialect.MySQLDialect
  true
  




Crear HibernateUtil:

Ahora vamos a crear una clase util, la cual sera encargada de generar las sessiones de Hibernate:
package com.ejemplo.util;
 
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
public class HibernateUtil {
 
	private static final SessionFactory sessionFactory = buildSessionFactory();
 
	private static SessionFactory buildSessionFactory() {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			return new Configuration().configure().buildSessionFactory();
		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}
 
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
 
	public static void shutdown() {
		// Close caches and connection pools
		getSessionFactory().close();
	}
}


Crear un test:

Vamos a generar un test para probar como todo funciona:

package com.ejemplo;

import static org.junit.Assert.*;
import java.util.List;

import org.hibernate.classic.Session;
import org.junit.Test;

import com.ejemplo.util.HibernateUtil;

public class HibernateTest {

	@Test
	public void test() {
		Persona persona = new Persona("Juan","Rodriguez");
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();
		session.save(persona);
		session.flush();
		
		List personas = session.createQuery("from Persona").list();
		assertFalse(personas.isEmpty());
		
		Persona personaGuarda = (Persona) session.get(Persona.class, persona.getId());
		assertEquals(persona, personaGuarda);
	}

}

Crear esquema en la base de datos:


Es necesario escribir un esquema llamado prueba en la base de datos Mysql.

Ahora a correr el Test y todo debería a andar!