RSS

Hibernate con Derby en Mac OSX / Linux

16 Abr

Vamos a hacer una prueba muy sencilla para trabajar con Hibernate en nuestro equipo. Para ello vamos a configurar una base de datos Apache Derby. Trabajaremos con el IDE de Spring de STS, además añadiremos Maven para la gestión de dependencias de nuestro proyecto.Configurar Hibernate en STS con Maven es sencillo. Lo único que hay que hacer es añadir las dependencias de Hibernate a nuestro pom.xml y empezar a programar.

Con Maven siempre puedes configurar los repositorios desde donde quieres cargar las dependencias a través del fichero settings.xml (se encuentra dentro de la carpeta conf en el path de instalación de Maven). Para buscar las dependencias STS ó Eclipse tienen un editor especial para los ficheros pom desde donde podemos encontrar y añadir las dependencias que necesitamos en nuestro proyecto. Si sabemos que vamos a necesitar una clase en concreto o queremos ver las distintas versiones de un jar que vamos a utilizar recomiendo visitar las siguientes dos páginas, mvnrepository y jarvana. La segunda es especialmente útil porque puedes buscar una determinada clase, proyecto o contenido. Nuestro fichero pom.xml tendrá este aspecto.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.hop2croft.pruebas.hibernate</groupId>
	<artifactId>pruebasHibernate</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<repositories>
		<repository>
			<id>jboss</id>
			<url>http://repository.jboss.org/maven2</url>
		</repository>
	</repositories>
	<dependencies>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate</artifactId>
			<version>3.5.1-Final</version>
			<type>pom</type>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-annotations</artifactId>
			<version>3.5.5-Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>3.5.5-Final</version>
		</dependency>
		<dependency>
			<groupId>antlr</groupId>
			<artifactId>antlr</artifactId>
			<version>2.7.6</version>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.1</version>
		</dependency>
		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6.1</version>
		</dependency>
		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.9.0.GA</version>
		</dependency>
		<dependency>
			<groupId>javax.transaction</groupId>
			<artifactId>jta</artifactId>
			<version>1.1</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.5.8</version>
			<type>pom</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>ejb3-persistence</artifactId>
			<version>3.3.2.Beta1</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.5.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.derby</groupId>
			<artifactId>derby</artifactId>
			<version>10.7.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.derby</groupId>
			<artifactId>derbyclient</artifactId>
			<version>10.7.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.derby</groupId>
			<artifactId>derbynet</artifactId>
			<version>10.7.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.derby</groupId>
			<artifactId>derbytools</artifactId>
			<version>10.7.1.1</version>
		</dependency>
		<dependency>
			<groupId>javax.security</groupId>
			<artifactId>jacc</artifactId>
			<version>1.0</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Una de las cosas que más me gusta de trabajar con Maven es que puedes o bien trabajar con tu IDE favorito o bien trabajar desde línea de comandos (o trabajar con los dos a la vez). Esto permite que independientemente que prefieras trabajar de una manera u otra siempre haya una forma de lograr que tu programa se pueda compilar, empaquetar en un jar o hacerlo correr en un servidor de aplicaciones.

Creado nuestro proyecto en STS y añadidas las dependencias para trabajar con Hibernate vamos a instalar Apache Derby en nuestra máquina. Nos descargamos Derby desde su página web y lo instalamos. Tenemos que añadir un par de variables de entorno a nuestro fichero /etc/profiles.

export DERBY_INSTALL=/Applications/Apache/db-derby-10.7.1.1
export DERBY_HOME=/Applications/Apache/db-derby-10.7.1.1
export CLASSPATH=$DERBY_INSTALL/lib/derby.jar:$DERBY_INSTALL/lib/derbytools.jar:$CLASSPATH

Apache además nos brinda la posibilidad de instalar un plug-in en Eclipse para Derby. En mi caso he preferido trabajar con Derby desde el terminal de comandos. Podemos ver la información de sistema una vez instalado Derby en el sistema.

ew-host:bin hop2croft$ java org.apache.derby.tools.sysinfo
----------------- Informaci?n de Java ----------------
Versi?n de Java:     1.6.0_24
Proveedor de Java:   Apple Inc.
Inicio Java:         /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Classpath de Java:   /Applications/Apache/db-derby-10.7.1.1/lib/derby.jar:/Applications/Apache/db-derby-10.7.1.1/lib/derbytools.jar:.java
Nombre del SO:       Mac OS X
Arquitectura del SO: x86_64
Versi?n del SO:      10.5.8
Nombre usuario Java: hop2croft
Dir. inicial usuario:/Users/hop2croft
Dir. usuario:        /Applications/Apache/db-derby-10.7.1.1/bin
java.specification.name: Java Platform API Specification
java.specification.version: 1.6
java.runtime.version: 1.6.0_24-b07-334-9M3326
--------- Informaci?n de Derby --------
JRE - JDBC: Java SE 6 - JDBC 4.0
[/Applications/Apache/db-derby-10.7.1.1/lib/derby.jar] 10.7.1.1 - (1040133)
[/Applications/Apache/db-derby-10.7.1.1/lib/derbytools.jar] 10.7.1.1 - (1040133)
------------------------------------------------------
-------------- Informaci?n de entorno local ----------
Entorno local actual:  [espa?ol/Espa?a [es_ES]]

Hecho esto arrancamos el servidor desde línea de comandos:

$ java -jar derbyrun.jar server start
Sat Apr 16 23:54:17 CEST 2011 : Se ha instalado el administrador de seguridad utilizando la directiva de seguridad de servidores b?sica.
Sat Apr 16 23:54:19 CEST 2011 : Apache Derby Network Server - 10.7.1.1 - (1040133) se ha iniciado y está listo para aceptar conexiones en el puerto 1527

y el cliente ij por otro lado:

$ ./ij
Versi?n ij 10.7
ij>

Desde el cliente podemos crear una nueva base de datos en el servidor con el comando siguiente:

$ ./ij
Versi?n ij 10.7
ij> connect 'jdbc:derby://localhost:1527/BDejemplo;create=true;user=hop2croft;password=hop2croft';

Si no te gusta usar el cliente desde el terminal hay varias alternativas, desde instalar el plug-in de Eclipse que mencione antes ó instalar un cliente como el sql developer ó Toad.Recomiendo este último porque tiene compatibilidad con Hibernate facilitandote el desarrollo.

Lo primero que vamos a hacer es crear el fichero hibernate.cfg.xml que nos servirá para indicar que nuestra aplicación se va a conectar a la base de datos recién creada.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
	<hibernate-configuration>
		<session-factory>
			<property name="connection.driver_class">
				org.apache.derby.jdbc.EmbeddedDriver
			</property>
			<property name="connection.url">jdbc:derby://localhost:1527/BDejemplo</property>
			<property name="connection.username">hop2croft</property>
			<property name="connection.password">hop2croft</property>
			<property name="dialect">org.hibernate.dialect.DerbyDialect</property>
			<property name="hibernate.generate_statistics">true</property>
			<property name="show_sql">true</property>
			<mapping resource="com/hibernate/entities/Coche.hbm.xml"/>
		</session-factory>
	</hibernate-configuration>

La propiedad show_sql permite que veamos en nuestra consola las sentencias sql que se lanzan sobre nuestra base de datos de

Derby. La última entrada del fichero anterior es el recurso que vamos a mapear. Ahora mapearemos las tablas de nuestra base de datos con objetos en nuestro proyecto de prueba. Esto último lo podemos hacer mediante un fichero de mapeo, en nuestro caso Coche.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<hibernate-mapping package="com.hibernate.entities">
		<class name="Coche" table="Coche">
			<id name="modelo" type="string" column="modelo"></id>
			<property name="marca" type="string" column="marca"></property>
			<property name="precio" type="int" column="precio"></property>
		</class>
	</hibernate-mapping>

Podríamos utilizar igualmente anotaciones:

@Entity
@Table (name="coche")
public class Coche {
	@Column (name="modelo")
	@Id
	private String modelo;
	@Column (name="marca")
	private String marca;
	@Column (name="precio")
	private int precio;
        // getters y setters
        ...

Lo siguiente será crear un Dao donde implementaremos toda la capa de acceso a la base de datos. En nuestro caso vamos a implementar un método para traernos todos los coches desde nuestra base de datos. Hibernate tiene un gestor de sessiones que se encarga de gestionar las transaciones.

	public List<Coche> readFromManager(){
		EntityManager manager = SessionManager.getEntityManager();
		EntityTransaction tran = manager.getTransaction();
		tran.begin();
		Query query = manager.createQuery("select b from Coche b");
		List<Coche> coches = query.getResultList();
		tran.commit();
		manager.close();
		return coches;
	}

Nuestro Dao ya está lista para ser usado por la capa de servicio (que ya os dejo a vosotros). Una posible salida sería esta.

Hibernate: select coche0_.modelo as modelo0_0_, coche0_.marca as marca2_0_0_, coche0_.precio as precio0_0_ from Coche coche0_ where coche().modelo=?
Modelo: A6
Marca:   Audi
Precio:   8
-------------------------------------
Hibernate: select coche0_.modelo as modelo0_0_, coche0_.marca as marca2_0_0_, coche0_.precio as precio0_0_ from Coche coche0_ where coche().modelo=?
5887 [main] INFO org.hibernate.stat.Statistics - HQL: from Book, time: 15ms, rows: 2
Modelo: Carrera
Marca:   Porche
Precio:   6
-------------------------------------
5893 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - Logging statistics....
5893 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - start time: 1302994741433
5893 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - sessions opened: 1
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - sessions closed: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - transactions: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - successful transactions: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - optimistic lock failures: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - flushes: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - connections obtained: 2
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - statements prepared: 2
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - statements closed: 2
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache puts: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache hits: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache misses: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities loaded: 2
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities updated: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities inserted: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities deleted: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities fetched (minimize this): 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections loaded: 0
5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections updated: 0
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections removed: 0
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections recreated: 0
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections fetched (minimize this): 0
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - queries executed to database: 1
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache puts: 0
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache hits: 0
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache misses: 0
5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - max query time: 15ms

Para terminar el post comentaros que en el fichero de configuración de Hibernate tenemos la opción de indicar que nos muestre estadísticas de nuestros accesos, consultas o sesiones a la base de datos. Es bastante útil para mejorar nuestra aplicación.

Share this:     

 
Deja un comentario

Publicado por en 16 abril, 2011 en Hibernate

 

Etiquetas: , , , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: