1.Introducción
Trabajar con software orientado a objetos y bases de datos relacionales puede
hacernos invertir mucho tiempo en los entornos actuales. Hibernate es una
herramienta que realiza el mapping entre el mundo orientado a objetos de las
aplicaciones y el mundo entidad-relación de las bases de datos en entornos Java.
El término utilizado es ORM (object/relational mapping) y consiste en la técnica
de realizar la transición de una representación de los datos de un modelo
relacional a un modelo orientado a objetos y viceversa.
Hibernate no solo realiza esta esta transformación sino que nos proporciona
capacidades para la obtención y almacenamiento de datos de la base de datos que nos reducen el
tiempo de desarrollo.
2. Entorno
Las herramientas usadas en este tutorial son las siguientes:
- MySQL 4.1.1
- JDBC Driver: mysql-connector-java-3.0.11-stable-bin.jar
- MySQL Control Center 0.9.4
- Apache ANT 1.6
- Hibernate 2.1.4 instalado en el directorio C:\java\hibernate-2.1\
3. Conceptos básicos de Hibernate
Hibernate funciona asociando a cada tabla de la base de datos un Plain Old
Java Object (POJO, a veces llamado Plain Ordinary Java Object). Un POJO es
similar a una Java Bean, con propiedades accesibles mediante métodos setter y
getter, como por ejemplo:
package net.sf.hibernate.examples.quickstart; public class Cat { private String id; private String name; private char sex; private float weight; public Cat() { } public String getId() { return id; } private void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public float getWeight() { return weight; } public void setWeight(float weight) { this.weight = weight; } } |
Para poder asociar el POJO a su tabla correspondiente en la base de datos,
Hibernate usa los ficheros hbm.xml.
Para la clase Cat se usa el fichero Cat.hbm.xml para mapearlo con la base de
datos. En este fichero se declaran las propiedades del POJO y sus
correspondientes nombres de columna en la base de datos, asociación de tipos de
datos, referencias, relaciones x a x con otras tablas etc:
<?xml version=»1.0″?> <!DOCTYPE hibernate-mapping PUBLIC «-//Hibernate/Hibernate Mapping DTD//EN» «http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd»> <hibernate-mapping> <class name=»net.sf.hibernate.examples.quickstart.Cat» table=»CAT»> <!– A 32 hex character is our <!– A cat has to have a name, but it <property name=»sex»/> <property name=»weight»/> </class> </hibernate-mapping> |
De esta forma en nuestra aplicación podemos usar el siguiente código para
comunicarnos con nuestra base de datos:
sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tx= Cat princess = new Cat(); session.save(princess); session.close(); |
Además tiene la ventaja de que nos es totalmente transparente el uso de la
base de datos pudiendo cambiar de base de datos sin necesidad de cambiar una
línea de código de nuestra aplicación, simplemente cambiando los ficheros de
configuración de Hibernate.
4. Confiración de Hibernate
Hasta ahora hemos obviado un dato importante en la configuración de Hibernate.
Los datos de configuración de la base de datos
Podemos usar un fichero hibernate.properties o hibernate.cfg.xml que debe
estar en el path de la aplicación:
hibernate.properties:
## MySQL
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect |
hibernate.cfg.xml – Conexión mediante Datasource:
<?xml version=’1.0′ encoding=’utf-8′?> <!DOCTYPE hibernate-configuration PUBLIC «-//Hibernate/Hibernate Configuration DTD//EN» «http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd»> <hibernate-configuration> <session-factory> <property name=»connection.datasource«> java:comp/env/jdbc/shop</property> <property name=»dialect«>net.sf.hibernate.dialect.MySQLDialect </property> <property name=»use_outer_join»>true</property> <property name=»transaction.factory_class»> net.sf.hibernate.transaction.JDBCTransactionFactory</property> <property name=»show_sql»>true</property> <!– Mapping files –> <mapping resource=»com/shop/Category.hbm.xml» /> <mapping resource=»com/shop/Product.hbm.xml» /> </session-factory> </hibernate-configuration>
|
hibernate.cfg.xml – Conexión Directa:
<?xml version=’1.0′ encoding=’utf-8′?> <!DOCTYPE hibernate-configuration PUBLIC «-//Hibernate/Hibernate Configuration DTD//EN» «http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd»> <hibernate-configuration> <session-factory> <property name=»connection.driver_class«> com.mysql.jdbc.Driver</property> <property name=»connection.url«> jdbc:mysql://localhost/test</property> <property name=»connection.username«>cesar</property> <property name=»connection.password«></property> <property name=»dialect«>net.sf.hibernate.dialect.MySQLDialect</property> <property name=»use_outer_join»>true</property> <property name=»transaction.factory_class»>net.sf.hibernate.transaction.JDBCTransactionFactory</property> <property name=»show_sql»>true</property> <!– Mapping files –> <mapping resource=»com/shop/Category.hbm.xml» /> <mapping resource=»com/shop/Product.hbm.xml» /> </session-factory> </hibernate-configuration>
|
En caso de encontrarse ambos ficheros el .properties y el .hbm.xml se usara
el .hbm.xml. Desde la aplicación también podemos especificar el
fichero a usar:
SessionFactory sf = new Configuration() .configure("catdb.cfg.xml") .buildSessionFactory(); |
En estos ficheros se indican los parámetros de conexión de la base de datos
como la base de datos a la que conectar, usuario y password etc.
Un parámetro interesante es el Dialecto de Hibernate. En este parámetro se
indica el nombre de la clase que se encargará de comunicarse con la base de
datos en el SQL que entienda la base de datos. Este parámetro ha de ser
siempre especificado. El valor ha de ser una subclase que herede de
net.sf.hibernate.dialect.Dialect
Hibernate nos proporciona los siguientes dialectos:
RDBMS | Dialect |
---|---|
DB2 | net.sf.hibernate.dialect.DB2Dialect |
MySQL | net.sf.hibernate.dialect.MySQLDialect |
SAP DB | net.sf.hibernate.dialect.SAPDBDialect |
Oracle (any version) | net.sf.hibernate.dialect.OracleDialect |
Oracle 9 | net.sf.hibernate.dialect.Oracle9Dialect |
Sybase | net.sf.hibernate.dialect.SybaseDialect |
Sybase Anywhere | net.sf.hibernate.dialect.SybaseAnywhereDialect |
Progress | net.sf.hibernate.dialect.ProgressDialect |
Mckoi SQL | net.sf.hibernate.dialect.MckoiDialect |
Interbase | net.sf.hibernate.dialect.InterbaseDialect |
Pointbase | net.sf.hibernate.dialect.PointbaseDialect |
PostgreSQL | net.sf.hibernate.dialect.PostgreSQLDialect |
HypersonicSQL | net.sf.hibernate.dialect.HSQLDialect |
Microsoft SQL Server | net.sf.hibernate.dialect.SQLServerDialect |
Ingres | net.sf.hibernate.dialect.IngresDialect |
Informix | net.sf.hibernate.dialect.InformixDialect |
FrontBase | net.sf.hibernate.dialect.FrontbaseDialect |
Aquí observamos la gran importancia del fichero de configuración, pues es
aquí donde se especifica que base de dato usamos, por lo que si cambiáramos de
base de datos bastaría con cambiar este fichero de configuración, manteniendo
nuestra aplicación intacta.
5. Hibernate Query Languaje HQL
Hibernate nos proporciona además un lenguaje con el que realizar consultas a
la base de datos.
Este lenguaje es similar a SQL y es utilizado para obtener objetos de la base
de datos según las condiciones especificadas en el HQL.
El uso de HQL nos permite usar un lenguaje intermedio que según la base de
datos que usemos y el dialecto que especifiquemos será traducido al SQL
dependiente de cada base de datos de forma automática y transparente.
Así una forma de recuperar datos de la base de datos con Hibernate sería:
Hibernate | JDBC |
Session session = sessionFactory.openSession(); List cats = null; try { categories = session.find(«from Cat«); Iterator i = categories.iterator(); while (i.hasNext() == true) { Cat cat = (Cat)i.next(); … } } finally { session.close(); }
|
Driver d = (Driver) Class.forName(«com.mysql.jdbc.Driver»).newInstance(); DriverManager.registerDriver(d);
try { Statement stmt = con.createStatement(); String select = ResultSet res = stmt.executeQuery(select); while (res.next() == true) { Cat cat = new Cat(catID,catName); list.add(cat); } } catch (Throwable ex) { |
De esta forma:
HQL | SQL |
from Cat |
select * from cat |
Como podemos observar se
simplifica considerablemente el código, así como se desacopla el uso de la base
de datos de nuestra lógica de aplicación.
6. Ejempo de Hibernate
Una vez descargado y descomprimido Hibernate, en el directorio eg existe un
ejemplo del funcionamiento de Hibernate.
Puesto que nosotros usamos como base de datos MySQL debemos configurar
adecuadamente el fichero
C:\java\hibernate-2.1\src\hibernate.properties:
Además, debemos copiar el fichero mysql-connector-java-3.0.11-stable-bin.jar
al directorio C:\java\hibernate-2.1\lib
Para ver el ejemplo debemos ejecutar en el directorio donde se encuentra
Hibernate (C:\java\hibernate-2.1\): ant eg:
ANT nos compilara y ejecutará el ejemplo comprobando sus resultados por
pantalla:
7. Herramientas usadas junto con Hibernate
Como se nos indica en la página de Hibernate
http://www.hibernate.org/102.html
Existen diversas herramientas útiles para el uso de Hibernate que cubren todo
el desarrollo desde nuestra aplicación hasta nuestra base de datos y viceversa:
Desde herramientas de modelado UML como por ejemplo con Poseidon podemos generar
modelos entidad relación que son traducidos por AndroMDA a POJO’s y
mediante XDoclet se generan los ficheros HBM. Todas estas tareas se
automatizan mediante el uso de ANT.
Otra opción es crear la base de datos con una herramienta de modelado y a
partir de la base de datos una vez creada usar Middlegen para generar los
ficheros HBM y a partir de estos los POJO’s mediante hbm2java.
Buenas tardes. Una pregunta, en el archivo de configuración de Hibernate yo defino la base de datos que deseo usar, hasta ahí todo bien. Mi duda es, en algún punto del programa existe una manera de cambiar de base de datos?es decir, cambiar momentáneamente la base de datos definida en Hibernate.cfg.xml por otra?Es que necesito conectarme a una BD ajena a mi portal en un módulo específico y no puedo unir las 2 BD en una.
Buenas Tardes. El tuturial es adecuado para refrescar los conocimiento.
Muy bueno el articulo. Gran introducción a Hibernate, para tutoriales de uso ya está el resto de la red, pero para iniciarse y saber donde te metes está perfecto.