Problema con acentos en jquery Autocomplete

Escrito por Dark

Fecha: 8/Septiembre/2009

Categoría: JQuery

Hace unos días que he estado trabajando con el plugin Autocomplete de jquery, y me encontre con el pequeño problema de que no envía correctamente los caracteres acentuados. Para el caso las paginas html de la aplicación y los servlets estan codificados con “UTF-8″. Así que después de investigar un poco descubri que basta con modificar el plugin y agregar la opcion “type” con “POST” a la llamada ajax localizada en la funcion request tal como sigue:

function request(term, success, failure) {
...
$.ajax({
 mode: "abort",
 type:"POST",
 port: "autocomplete" + input.name,
 ...

Ya que el plugin no tiene definido el tipo, usa “GET” por defecto el cual no tiene establecido el Charset, por lo cual se generan problemas al buscar.

Pues eso es todo, espero que les sea de utilidad.

Ejemplo de Buscador con Web Services

Escrito por TheRealThom

Fecha: 30/Agosto/2009

Categoría: Java, Web Services

Algo simple y sencillo, vamos a darle un poco de más enfoque al uso de los Web Services creando un formulario en donde puedas introducir un texto y te regrese los resultado que coincidan con el contenido de un archivo, de un vector, de una base de datos o cualquiera cosa donde tengamos almacenados nuestros datos. En este caso y solo para fines demostrativos simularemos una tabla de una base de datos con un ArrayList, el cual pasaremos por el Web Service al cliente. Los requerimientos son pocos y ya vienen integrados en el Netbeans, la aplicación se ejecuta con GlashFish v2, v3 o jboss 4.2 en adelante (Bueno, al menos con esos AS la probé).

Para no poner tanto código, pongo la aplicación completa para que la descarguen, la cual se compone de dos módulos, el proveedor (SearchWSApp) y el consumidor (ClientWSApp). De cualquier manera aquí explicaré lo más relevante solo para no extrañar.

Observación: Si alguien tiene duda de como crear web services puede consultar este post.

Proveedor.

Como pueden observar en el proyecto la aplicación SearchWSApp se compone de un Web Service (SearchWSService), cuyo código crear una instancia de la clase SearchDAO, en esta última clase se encuentra el código que simula la conexión a la base de datos, ya que solo se tomarán los datos desde un ArrayList.

wsapp_02

Consumidor

La aplicación ClientWSApp se compone de dos jsp, de un servlet y de una clase donde se encuentra la funcionalidad que permita enviar y recibir los datos al proveedor.

  • index.jsp contiene el formulario que envia los datos al servlet.
  • resultado.jsp obtiene de la sesión un vector que el servlet le envía como respuesta del contacto con el web service.

Los jsp se muestran en la siguiente imagen.

wsapp_03

El servlet y la clase SearchBO se explican por si solas, quizás lo unico relevante es que el resultado se está recibiendo del web service  en una lista, a veces pasar listas por web services puede compliarse cuando son arreglos que contienen POJOS, pero eso precisamente es lo más útil y común en una programación orientada a objetos y ocupando algunos patrones de diseño. En la siguiente imagen se muestra el código de las clases en cuestión.

wsapp_04

Los proyectos se ven como se puede observar en la siguiente figura, a menos que le hayan hecho alguna modificación a los nombres.

wsapp_05

Ahora bien, ya que entendimos el código, vamos a proceder haciendo deploy en la aplicación SearchWSApp, esto levantará el servidor de aplicaciones GlassFish si es que no configuraron algún otro. Una vez que el Proveedor se encuentre desplegado en el AS, ejecutámos el ClientWSApp, lo cual nos abrirá el navegador que tengamos configurado por default en el NetBeans y abrirá el formulario, si introducimos alguna cadena como “thom”, “perez” o  “sanchez” mostrará la siguiente página co los resultado obtenidos, si no encuentra ningún resultado, simplemente lo indicará con un mensaje. La vista de las páginas se muestra a continuación. No son muy bonitas, pero hacen lo suyo.

wsapp_06Si tiene algún problema pueden comentarlo aquí, uno de los  más comunes es que no despliegan el proovedor antes de ejecutar el consumidor, lo cual haría que el consumidor no encontrara publicado el WSDL, para probar que el WSDL se encuentra publicado podemos escribir la siguiente dirección en el navegador y ver si sale algo como lo que se muestra en la misma imagen.

wsapp_07La dirección mostrada en la figura anterior es válida si y solo si no modificaron los nombres de los archivos en los proyectos.

Pues bien, ahí tienen un prototipo de buscador, dudo que le estemos haciendo la competencia a Google con eso, pero al menos a Bing si :P

– Descargar proyectos para NetBeans 6.5/6.7:  SearchWSApp

Hasta la próxima!

Maven y el infortunio del driver ojdbc14

Escrito por TheRealThom

Fecha: 16/Julio/2009

Categoría: Maven

Tags: ,

Que tal!

En los últimos días he estado desarrollando una pequeña aplicación con Maven2, en la cual me fue necesario agregar el driver de Oracle. Generalmente cuando no utilizamos Maven es muy fácil agregar esta librería al proyecto, que es como cualquier otra, sin embargo cuando usamos esta herramienta se vuelve algo extrañamente complicado. El procedimiento, suponía, era el mismo que para agregar cualquier otra librería al repositorio, sin embargo me encontré con la sorpresa de que los drivers que Oracle distribuye no se encuentran en los repositorios de Maven… Pero cómo? Pues sí, tal parece que es una cuestión de aceptación de licencias que se debe hacer explícitamente antes de descargarlos. Bueno, debe haber una solución a esas tonterías me dije… y si, es cuestión de instalar el driver a mano en el repositorio local y listo! podremos ocuparlo como si no hubiera pasado nada. A continuación se explica cómo:

1. Descargar el driver desde la página de Oracle, en caso de no tenerlo ya, claro.
2. Introducir en la consola el siguiente comando:

mvn install:install-file -Dfile=/PATH_TO_FILE/ojdbc14.jar \
-DgroupId=com.oracle \
-DartifactId=ojdbc14 \
-Dversion=10.1.0.5 \
-Dpackaging=jar \
-DlocalRepositoryPath=/PATH_TO_LOCAL_REPO/.m2/repository

Detalles:

PATH_TO_FILE se refiere al directorio en donde tengamos el jar de driver.
PATH_TO_LOCAL_REPO es el directorio en donde tenemos el repositorio local instalado.
-Dversion puede variar, dependiendo del driver que hayan descargado de la pagina de oracle, sean específicos.

3. Ahora, desde el POM del proyecto, agreguen una dependencia de la siguiente manera:

<dependencies>
     <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14</artifactId>
            <version>10.1.0.5</version>
            <scope>compile</scope>
        </dependency>
</dependencies>

* La versión debe coincidir con la que pusieron en el comando del punto 2.
* El Scope puede ser compile, provided o cualquiera que acepte Maven2, si el driver ya se encuentra en su Servidor de Aplicaciones deben ponerle provided.

Y ahí tienen, el driver agregado por medio de Maven2. Provecho!

Borrar todos los objetos de un esquema de oracle

Escrito por blood

Fecha: 11/Julio/2009

Categoría: Bases de Datos

Un script muy útil para borrar todos los objetos de un esquema sin borrar el esquema en si.

/** -----------------------------------------------------------------------------------

Author : Peter Tesone

Description : Drops all objects in the current schema. Take careful !!!

Platforms : 8i,9i,10g.

**/ ———————————————————————————–

begin

– constraint cursor

for cur_con in

(select table_name,

constraint_name

from user_constraints

where constraint_type = ‘R’) loop

– drop constraint

execute immediate ‘alter table ‘ || cur_con.table_name || ‘ drop constraint ‘ || cur_con.constraint_name;

– show constraint removed

dbms_output.put_line(‘constraint name :’ || cur_con.constraint_name);

end loop;

– object cursor

for cur_obj in

(select object_name,

object_type

from user_objects) loop

begin

– drop object

execute immediate ‘drop ‘ || cur_obj.object_type || ‘ ‘ || cur_obj.object_name;

– show object removed

dbms_output.put_line(cur_obj.object_type || ‘ name :’ || cur_obj.object_name);

exception

when others then

null;

end;

end loop;

end;

Deployando en un OC4J desde NetBeans 6.5

Escrito por blood

Fecha: 23/Febrero/2009

Tags: , ,

Hola, pues cambiando de aires es necesario deployar aplicaciones en algunos horribles servidores de aplicaciones, como es el caso de OAS 10.3.x. De manera que si no queremos desarrollar en el IDE de Oracle llamado JDeveloper podemos hacer lo siguiente para que nuestro amado NetBeans sea capaz de deployar aplicaciones en OAS.

Lo primero es agregar un repositorio a NetBeans:

Herramientas>Complementos>Configuracion>Agregar

Nombre: MiRepositorio

URL: http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz

Después solo neceistamos recargar la lista de complementos disponibles y buscar el complemento llamado OC4J J2EE Container.

Ubuntu 8.10 Intrepid Ibex en la HP MiniNote 2133

Escrito por TheRealThom

Fecha: 18/Enero/2009

Categoría: GNU/Linux, Software

Que caray… pues aqui estoy de regreso, no se por qué se me da la costumbre de abandonar por largo tiempo los blogs, pero para no pelear solo diré que fue porque no tenia nada nuevo que aportar, a veces el trabajo se muestra algo tedioso y mis intereses vuelan por la ciencia ficción o la historia, pero aquí estoy de nuevo :’D pese a quien le pese!

Hace cosa de dos meses adquirí la MiniNote 2133 de HP, como mucha gente (de la que le entiende al contenido del blog al menos) de los pocos defectos que le encontré es que traía instalado Windows Vista, esa misma tarde desapareció de su disco duro de 120 Gigas y apareció Windows XP (Solo por costumbre) y Ubuntu 8.04, la instalacion de Windows XP fue muy simple y realmente no cabe decir nada más acerca de eso, sin embargo, al momento de instalar Ubuntu hubo algunos problemas, cosa que no me amilanó porque el gusto de verlo instalado iba a hacer que todo valiera la pena… seguí religiosamente las instrucciones de una página muy conocida para quien haya intentado la misma instalación: https://wiki.ubuntu.com/LaptopTestingTeam/HP2133. Página altamente recomendable, sin embargo hay un pequeño detalle y es el archivo xorg.conf, ya que al sobreescribirlo tal cual dice y al reiniciar el sistema, sigue con la más baja resolución de pantalla y no hay manera de cambiarla. Largo tiempo estuve investigando sin éxito. Surgió Intrepid Ibex e hice las mismas pruebas, y nada, pero el viernes pasado llegué a casa con la intención de no dormir con tal de que quedara, y bueno, sin mucho trabajo y como por arte de magia encontré la solución.

Paso a paso:

1. Instalar ubuntu como lo indica el wiki hasta el punto de Video Driver Fix, en ese punto seguir con el paso 2.
2. Cuando la instalación haya terminado y al reiniciar la computadora, elegir Reiniciar en modo a prueba de errores.
3. Toca el turno de la instalación del driver de Via.
3.1. El driver para 2D (resolucion 1024×600) lo pueden descargar de aqui.

3.1.2. Descomprimir el driver recién descargado, entrar a la carpeta resultante e instalarlo desde consola con root: $ sudo ./v2DInstall
3.1.3. Este punto es muy importante, antes de reiniciar, sobreescribir el archivo /etc/X11/xorg.conf por este.
4. Reiniciar y disfrutar una chula nueva instalación de Ubuntu 8.10 Intrepid Ibex en la MiniNote 2133.

Lo más complejo del asunto es configurar o encontrar al menos, un xorg.conf que funcione, pero bueno, una vez que ha funcionado hay que compartlrlo :-)

Ubuntu se comporta mucho mejor que windows XP y Vista en la MiniNote, como era de suponerse, instalé todo el entorno de desarrollo para mi trabajo y hobbies: NetBeans, JBoss, el JDK y hasta ¡¡Oracle XE!! además de un IDE para Python (SPE) y solo por probar, instalé VirtualBox y con ésta, windows XP, que no es por presumir, pero funcionó sin mayor problema con los recursos disponibles.

Por fin tengo mi MiniNote como la quería XD. ¡Aquí nos vemos!

Good Luck!

Internacionalización en JAVA

Escrito por blood

Fecha: 12/Enero/2009

Categoría: Java

Muchas veces nos enfrentamos con problemas de formatos internacionales cuando programamos en java, de tal modo que cuando utilizamos instancias de la clase Date por ejemplo, nos imprime valores como “January” en lugar de “Enero” y cosas por el estilo.

A continuación se muestra un ejemplo para resolver este tipo de problemas utilizando la clase SimpleDateFormat y Locale.

java.util.Locale MX = new Locale("es","MX");
java.text.SimpleDateFormat FormatoFecha = new SimpleDateFormat("dd/MM/yyyy h:mm:ss a", MX);
String Fecha Formateada = FormatoFecha.format(new Date());

Esto dará como resultado el mes actual en español de México (o castellano).

Hasta Luego.

Secuencias de Oracle en Hibernate

Escrito por TheRealThom

Fecha: 25/Octubre/2008

Categoría: Hibernate

Tags:

Algo simple y sencillo: Vamos a describir como utilizar Secuencias de Oracle en Hibernate.

Las secuencias se utilizan generalmente para asignar la llave primaria (primary key) en los registros que vamos insertando en nuestras tablas, evitando tener que calcular el número asignado a la llave en el último registro que insertamos, así pues, vamos a crear una tabla, la cual utilizaremos de ejemplo junto con la secuencia.

CREATE TABLE usuarios (
   idUsuario INT PRIMARY KEY,
   usuario VARCHAR2(15) NOT NULL,
   passwd VARCHAR2(15) NOT NULL
);
 
CREATE SEQUENCE seq_usuarios
   INCREMENT BY 1
   START WITH 1
   NOMAXVALUE
   NOMINVALUE
   NOCYCLE;

La secuencia anterior se llama seq_usuarios, se va incrementando en 1, empieza en 1, no tiene un valor máximo ni un valor mínimo definido, no se comporta de manera cíclica.

Como se puede observar en el Post de mike acerca de Hibernate, debemos de crear un POJO (Plain Old Java Object), el cual contendrá tantos métodos setters y getters como campos tenga nuestra tabla, en este caso nuestro POJO quedaría de la siguiente manera.

package com.hibernate.pojos;
 
/**
 *
 * @author thom
 */
public class Usuarios {
    private int idUsuario;
    private String usuario;
    private String passwd;
 
    public Usuarios() {
    }
    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }
    public int getIdUsuario() {
        return idUsuario;
    }
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    public String getUsuario() {
        return usuario;
    }
    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
    public String getPasswd() {
        return passwd;
    }
}

El siguiente paso puede verse en el post de mike, donde configuramos el archivo hibernate.cfg.xml con los datos de la conexión de la base de datos, el usuario, password, etc.

Después vamos a configurar el archivo *.hbm.xml, describiendo la estructura de nuestra tabla y asociandola con los atributos del POJO, quedando de la siguiente manera:

<hibernate-mapping>
    <class dynamic-insert="false" dynamic-update="false" mutable="true" 
name="com.hibernate.pojos.Usuarios" optimistic-lock="version" polymorphism="implicit" 
select-before-update="false" table="USUARIOS">
        <id name="idUsuario" column="IDUSUARIO" type="integer">
            <generator class="sequence">
                <param name="sequence">seq_usuarios
                </param>
            </generator>
        </id>
        <property name="usuario" column="USUARIO" type="string">
        </property>
        <property name="passwd" column="PASSWD" type="string">
        </property>
    </class>
</hibernate-mapping>

En el anterior código XML podemos observar el objetivo de este Post, en el miembro id se está indicando que es de tipo entero y se relaciona con el campo IdUsuario de la tabla usuarios, además el valor que se le asiganrá será una secuencia, el valor que se encuentra dentro del miembro param es el nombre de la secuencia, en este caso seq_usuarios, en esta parte solo ese valor a de cambiarse dependiendo del nombre de tu secuencia.

El código Java sería el siguiente:

try {
   SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
   Session session = sessionFactory.openSession();
   Transaction tx = session.beginTransaction();
   Usuarios usuario = new Usuarios();
   usuario.setUsuario("thom");
   usuario.setPasswd("123456");
   session.save(usuario);
   tx.commit();
   session.close();
} catch (HibernateException e) {
   throw new RuntimeException(e.getMessage());
}

¡Y listo amigos! ¡A disfrutar! (Como diría el Chef Chava de Neurótica.fm).

Problema con Ajax en Internet Explorer

Escrito por blood

Fecha: 10/Octubre/2008

Categoría: Java

Hola, este es un problema muy común para los desarrolladores web, sucede que ciertas ocasiones nuestra aplicación se comporta extrañamente en el muy odiado pero usado Internet Explorer, gran parte de estos problemas se deben a que dicho navegador guarda (o cachea) datos para no hacer demasiadas solicitudes al servidor, lo cual provoca que muchas de nuestras llamadas asincronas den resultados inesperados.

La solución a este problema está del lado del servidor, solo tenemos que agregar los siguientes parametros a la cabecera de nuestro objeto response desde un servlet o un JSP:

response.addHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("pragma", "no-cache");
response.addDateHeader("Expires", -1);

Y listo. (Se agradecen sus comentarios y/o soluciones alternas)

Persistencia de Objetos con Hibernate (Parte 1)

Escrito por miklex

Fecha: 29/Septiembre/2008



Hala a todos!!! (hahaha típico saludo de blood)

En esta ocasión les traigo un “mini tutorial” del manejo de la persistencia de objetos con Hibernate (hahaha también conocido de manera incorrecta como Hiberné, Hibernet ó el muy gracioso Hiberante; si no me creen busquen en Google :p).

Este tutorial he decidido dividirlo en 3 partes, en particular esta entrada se centra en conceptos básicos y en la configuración general de Hibernate. Los post siguientes tratarán de cuestiones que exijen un poco más de trabajo en la configuración y en la programación así como algunos errores comunes que se cometen de manera involuntaria, asi que empecemos por lo esencial.

¿Qué es persistencia?

La persistencia es la capacidad de un lenguaje de programación o entorno de desarrollo para almacenar y recuperar el estado de los objetos de forma que sobrevivan a los procesos que las manipulan. Dicho de otra manera: es conseguir que los datos de un objeto sobrevivan a la ejecución de un proceso padre (en donde fueron creados), para que puedan ser reutilizados por otros procesos.

Existen diversas técnicas para hacer uso de la persistencia, siendo las principales: La Serialización (mediante la interfaz java.io.Serializable de Java), el uso de un motor de persistencia(como Hibernate) o el uso de un manejador de base de datos orientada a objetos.

Pero como dice nuestro título, veremos la persistencia mediante el uso de Hibernate.

¿Qué es un motor de persistencia?

Traducción del Motor de Persistencia

Traducción del Motor de Persistencia

Es un componente de software que realiza la traducción de registos de base de datos relacional a objetos y viceversa. Esta traduccíon es conocida como mapeo o mapping que precisamente es una técnica de programación para convertir el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en la base de datos relacional.

Las principales ventajas del uso de un motor de persistencia son que por una parte, el programa solo ve que puede guardar y recuperar objetos, como si estuviera programado para una base de datos orientada a objetos, y a su vez la base de datos sólo ve que guarda registros y recupera registros como si el programa estuviera dirigiendose a ella de forma relacional. Y tal vez la principal: es posible programar con orientación a objetos, aprovechando las ventajas de flexibilidad, mantenimiento y reusabilidad.

Estos conceptos son necesarios para poder entender el funcionamiento de Hibernate, así que vamos a la acción.

Trabajando con Hibernate

******************************************************************************************************
Para poder usarlo hay que bajar las librerías de Hibernate Core aquí y claro, añadirlas al proyecto
******************************************************************************************************

Es un framework de java, el cual facilita el mapeo de atributos mediante archivos XML que permiten establecer relaciones entre una base de datos relacional y objetos Java, creando un entorno Objeto-Relacional.

Para lograr esto es necesario detallar cómo es el modelo de datos, qué relaciones existen y qué forma tienen. Con esta información Hibernate le permite a la aplicación manipular los datos de la base operando sobre objetos, con todas las características de la programación orientada a objetos. Hibernate convierte los datos entre los tipos utilizados por Java y los definidos por SQL.

Hibernate genera las sentencias SQL y libera al programador del manejo manual de los datos que resultan de la ejecución de dichas sentencias, manteniendo la portabilidad entre todas (o por lo menos la mayoría) de las bases de datos con un ligero incremento en el tiempo de ejecución. Lo que es una ventaja importe, nunca se esta atado a usar siempre un mismo manejador de base de datos.

Hibernate está diseñado para ser flexible en cuanto al esquema de tablas utilizado, para poder adaptarse a su uso sobre una base de datos ya existente. También ofrece un lenguaje de consulta de datos llamado HQL (Hibernate Query Language), al mismo tiempo que una API para construir las consultas programáticamente (conocida como “criteria”).

Hablando un poco de la composición de Hibernate, pueden destacar 3 módulos:

Proveedor de Conexiones: Este administrador provee un manejo eficiente de las conexiones a las base de datos. Las conexiones son la parte más costosa al momento de interactuar con la base de datos pues requieren de muchos recursos al momento de abrir o cerrar la conexión. Sin embargo, los desarrolladores de Hibernate recomiendan no usar este administrador en un ambiente de producción, por lo cual, en la siguiente parte hablaremos un poco de C3P0, un framework de Java que lleva a cabo esta tarea.

Fabrica de Transacciones: Este servicio provee al usuario la habilidad de ejecutar más de una sentencia a la base de datos a la vez.

Fábrica de Sesiones (Session Factory): La Fábrica de Sesiones es aquella que se encarga de decir al sistema, donde se encuentran todos los ficheros de mapeo de Hibernate, el dialecto de Hibernate a utilizar (varía según el gestor de base de datos). De esta componente se generan los objetos Session de Hibernate, los cuales son los encargados de realizar todas las operaciones sobre la base de datos.

Ahora bien, empecemos con la verdadera acción, para poder definir nuestro modelo de datos desde el paradigma orientado a objetos es necesario crear clases llamadas POJO (Plain Old Java Object). Estas clases representan nuestras tablas de la base de datos pero claro, como objetos. Lo único que necesitan estas clases son métodos SET y GET por cada uno de los atributos de la tabla, como su nombre lo indica, set es el método que asigna el valor a la variable, y get el que lo obtiene. Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Contacto{
      prívate int idContacto;
      private String nombreContacto;
      private String telefonoContacto;
      private String direccionContacto;  
 
public Contacto(){}
public void setIdContacto(int valor){
	this.idContacto=valor;
}
public int getIdContacto(){
	return idContacto;
}
public void setNombreContacto(String valor){
	this.nombreContacto=valor;
}
public String getNombreContacto(){
	return nombreContacto;
}
public void setTelefonoContacto(String valor){
	this.telefonoContacto=valor;
}
public String getTelefonoContacto(){
	return telefonoContacto;
}
public void setDireccionContacto(String valor){
	this.direccionContacto=valor;
}
public String getDireccionContacto(){
	return direccionContacto;
}
}

Lo siguiente será definir la estructura de nuestra base de datos en un archivo XML llamado nombre_del_archivo.hbm.xml (OJO (u¬¬) nombre_del_archivo es cualquiera que deseen). Este archivo es conocido como archivo de mapeo (o mapping), este archivo contiene (tan detallado como se necesite) la estructura de la base de datos y a su vez a que clase POJO va asociada cada tabla.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="mipaquete.Contacto" table="Contacto">
   <id name="idContacto" type="integer" column="idContacto" >
   <generator class="assigned"/>
  </id>
  <property name="nombreContacto" column="nombreContacto" type="string"/>
  <property name="telefonoContacto" column="telefonoContacto" type="string"/>
 <property name="direccionContacto" column="direccionContacto" type="string"/>
 </class>
</hibernate-mapping>

Vamos a entender la estrucura del archivo de mapeo; a primera instancia notese que inicia con la etiqueta hibernate-mapping :p, a partir de aquí pueden ser agregadas cuantas Tablas(Clases) deseemos mapear, haciendo uso de la etiqueta class y de algunas de sus propiedades:

name: Se debe indicar la clase POJO que se utilizará para el mapeo.
table: Es el nombre de la tabla en la base de datos.
mutable: Especifica si las instancias de esa clase pueden sufrir cambios.
y algunos otros…

Lo siguiente es describir las propiedades de la clase, lo primero es definir la llave primaria (o id). La llave puede ser especificada de muchas formas distintas, si es asignada, si se obtiene por medio de alguna secuencia(sequence), algoritmos hi/lo, etc.; estas formas dependen del SMBD, pero las más comunes siempre serán asignarlas manualmente o por medio de una secuencia.

La etiqueta id, tiene como principales atributos: name: en cual especifica el atributo de la clase POJO que corresponde, type: el tipo de dato a utilizar; column: el nombre del campo de la tabla de la base de datos. Y para la definición del tipo de llave primaria hace uso del miembro generator, mediante su atributo class es como le indicamos a Hibernate como es nuestra PK.

Lo siguiente será enlistar todas las propiedades restantes mediante la etiqueta property. Property tiene como principales attributos name (nombre de del atributo de la clase POJO), type(tipo de dato), column(nombre de la columna de la tabla de BD), length(longitud del campo) y not-null(nulo??), pero claro tiene algunas más.

Como vemos no resulta muy difícil generar este archivo, pero sí llega a ser tedioso cuando tenemos una cantidad considerable de tablas que deseamos mapear.

Teniendo definida la estructura de la base de datos es momento de configurar Hibernate, claro, creando un archivo XML llamado hibernate.cfg.xml.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--1--><property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver
        </property>
<!--2--><property name="hibernate.connection.url">jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:XX
        </property>
<!--3--><property name="hibernate.connection.username">nombre_usuario
         </property>
<!--4--><property name="hibernate.connection.password">password
        </property>
<!--5--><property name="show_sql">true
        </property>
<!--6--><property name="dialect">org.hibernate.dialect.OracleDialect
        </property>
        <!-- Archivos de Mapeo -->
       <mapping resource="contacto.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Hibernate proporciona un gran número de propiedades para poder realizar su configuración, pero de momento solo nos centraremos en las necesarias para lograr un buen funcionamiento, básico, pero bueno. Observemos el ejemplo, la primera propiedad hace referencia al driver de conexión para la BD que utilizaremos, en el ejemplo se hace para Oracle. En la segunda propiedad se especifica la cadena de conexión que se utilizará. Las propiedades 3 y 4 son datos de autenticación del usuario o esquema de la BD. La 5ta propiedad es opcional, y para fines de ejemplo la colocamos; su función es imprimir en consola la sentencia HQL o SQL ejecutada por Hibernate. En la 6ta propiedad se debe indicar el diálecto de la base de datos que utilizaremos, es necesaria para que Hibernate puede realizar la traducción correcta de los tipos de datos y sintaxis de las consultas.

En el atributo resources de mapping indicamos la ubicación del archivo de mapeo creado anteriormente. Y con esto estamos listos para empezar a realizar operaciones sobre la base de datos. Ejemplo

....
private void guardarObjeto(MiObjeto obj) {
    try {
 1)      SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
 2)      Session session = sessionFactory.openSession();
 3)      Transaction tx = session.beginTransaction();
 4)       session.save(obj);
 5)       tx.commit();
 6)      session.close();       
    } catch (HibernateException e) {
        throw new RuntimeException(e.getMessage());
    }
}
....

A continuación se describe el ejemplo anterior:


1)Se inicializa la Fábrica de Sesiones configurándola a partir del archivo hibernate.cfg.xml.


2)Se obtiene una sesión de la Fábrica de Sesiones con la que realizarán las operaciones.

3)Se inicia una transacción con la base de datos, esta transacción es la encargada de mantener el acceso a los datos y de realizar un commit para terminar con la operación o un rollback en caso de haberse generado un error.

4)Se ejecuta la operación deseada, en el ejemplo se usa el método save del objeto session, que es lo equivalente a realizar un insert en la base de datos. Si se quisiera realizar una búsqueda bastaría con usar load(clase.del.objeto, id_a_buscar). Una actualización se realiza con update(objeto) o con saveOrUpdate(objeto), la diferencia radica en que saveOrUpdate inserta el registro en caso que éste no exista. Y para eliminar bastará con usar delete(objeto).

5)Se cierra la transacción con un commit, Este paso es muy importante, pues al no realizar el commit, ninguna de los cambios de guardará en la base de datos.

6)Se concluye la operación al cerrar la sesión y libera todos sus recursos.

Aquí concluye esta primera parte, se ha visto solamente la parte básica del funcionamiento de hibernate; en los próximos días estaré publicando la segunda parte con un ejemplo más completo, con las operaciones tipicas de una aplicación CRUD (Create, Retrieve, Update and Delete) en una sola clase y algunos detalles finos en el manejo del objeto Session y del archivo de mapeo.

Como comentario final a este post, los errores más comunes en esta parte surgen en las clases POJO y en el archivo de mapeo, ya sea por errores de dedo o porque falta algun método set o get para un atributo, Así que cuidado, igualmente no esta de más revisar los propiedades del hibernate.cfg.xml
.

Que les aproveche, saludos!!!

Ja na!!

ミゲエル