Persistencia con Spring

0
24655

Persistencia con Spring

En el siquiente tutorial vamos a ver algunas de las aportaciones que nos ofrece Spring para mejorar la capa de persistencia de nuestras aplicaciones.

Se presupone que el lector ya posee conocimientos de JUnit, Hibernate, Maven y Spring.

Indice de contenido:

  1. Introducción.
  2. ¿Qué proporciona Spring a la capa de persistencia?.
  3. Andando se hace el camino, un ejemplo:

    1. Entorno.
    2. Estructura del proyecto de ejemplo.
    3. Script de creación de la tabla de ejemplo sobre MySQL.
    4. Maven 2: Archivo de configuración.
    5. POJO.
    6. DAO usando JDBC.
    7. DAO usando Hibernate 3 (con y sin anotaciones).
    8. Spring 2: Archivo de configuración.

      1. Origenes de datos.
      2. JDBC.
      3. Hibernate 3 sin anotaciones.

        1. Archivo de mapeo de hibernate 3 para los productos (Product.hbm.xml)
      4. Hibernate 3 con anotaciones.
    9. Probando la aplicación a través de tests con JUnit 4
  4. Referencias
  5. Conclusiones

Introducción

Bien es sabido que el trabajo con bases de datos suele ser repetitivo: configurar origenes de datos, obtener conexiones, ejecutar consultas, analizar resultados, gestionar posibles errores y liberar recursos.
Además cuando estos recursos no son liberados correctamente (programadores con poca experiencia, proyectos que van mal de tiempo, despistes, etc.) suele ser fuente de graves problemas, teniendo que andar usando herramientas para detectar en que puntos de la aplicación se han dejado abiertos.

Cuando se produce una excepción de acceso a datos suele generarse una SQLException, excepción genérica donde las haya y dificil de interpretar » No existe una
jerarquía definida de excepciones que distingan los distintos errores que pudieran producirse
.

Por si fuera poco, SQLException es de obligada captura, por lo que tenemos que tener muchos try catch por el código, cuando normalmente con este tipo
de excepciones los programadores poco pueden hacer más que normalmente mostrar un mensaje de error del tipo «… inténtelo más tarde …»

¿Qué proporciona Spring a la capa de persistencia?.

  • Una serie de plantillas para trabajar con JDBC y los ORM más extendidos (Hibernate, iBatis, etc.) y que nos ahorran las tareas repetitivas
    que hemos comentado en la introducción, de manera que sólo nos debemos preocupar de realizar las tareas concretas de nuestro negocio ahorrándonos
    realizar el resto de operaciones (apertura de conexiones, liberación de recursos, etc.) evitándonos los posibles errores que pudieramos cometer, como por ejemplo, liberar recursos.
  • Una serie de DAOs (que tienen plantillas pre-asociadas) de las que pueden heredar nuestros DAOs.
  • Nos proporciona una rica jerarquía de clases de error en las operaciones de acceso a datos, es decir, adiós a la genérica SQLException.

    http://static.springframework.org/spring/docs/2.5.x/reference/dao.html#dao-exceptions.

    Además, estas excepciones no son de obligado tratamiento, por lo que nos evita tener que estar capturandolas cuando no podemos hacer nada para solventar el problema y permitiéndonos capturar las que nos interese de un modo concreto y no de forma obligada y genérica.

  • Fácil integración con los ORM más extendidos, incluso evitándonos tener que casar nuestro código a implementaciones concretas.
  • Potente y completo soporte de transacciones: Definición declarativa incluso con anotaciones del alcance y tipo de transacción.

    Declaración de transacciones a través de aspectos (AOP).

    (La transaciones no están cubiertas en este tutorial)

Andando se hace el camino, un ejemplo:

A continuación vamos a ver un completo ejemplo autocomentado del uso de Spring en la capa de persistencia de nuestra aplicación.

Entorno

El siguiente ejemplo está contruido en el siguiente entorno:

  • HP Pavilion.
  • Windows Vista Home Premium.
  • Eclipse Ganymede.
  • Java 6.
  • Maven 2.
  • Plugin Maven 4QE para Eclipse.
  • Un café y buena música.

Estructura del proyecto de ejemplo:

Una de las muchas ventajas de Maven es que estandariza la estructura de los proyectos, es decir, cualquier persona con conocimientos de Maven tendría facilidad de comprender como se estructura y dónde está cada cosa dentro del proyecto.

Vamos a comentar sólamente algunas partes que no forman parte de la estructura estándar, sino que es dependiente de esta aplicación concreta:

  1. /src/main/resources/hibernate/mappings/Product.hbm.xml:

    Archivo de mapeo de Hibernate 3 de la clase Product (ejemplo sin anotaciones).

  2. /src/main/resources/jdbc.properties:

    Propiedades de configuración de persistencia: usuario, contraseña, etc.

  3. /src/main/resources/applicationContext.xml:

    Archivo de configuración padre de Spring 2 (importará otros archivos de configuración).

  4. /src/main/resources/appContextDataSource.xml:

    Archivo de configuración de Spring 2 en donde definiremos los orígenes de datos de nuestra aplicación.

  5. /src/main/resources/appContextJDBC.xml:

    Archivo de configuración de Spring 2 en donde definiremos lo necesario para el ejemplo de acceso a través de JDBC.

  6. /src/main/resources/appContextHibernate3.xml:

    Archivo de configuración de Spring 2 en donde definiremos lo necesario para el ejemplo de acceso a través de Hibernate 3 sin anotaciones.

  7. /src/main/resources/appContextHibernate3Anotaciones.xml:

    Archivo de configuración de Spring 2 en donde definiremos lo necesario para el ejemplo de acceso a través de Hibernate 3 con anotaciones.

Archivo de configuración de Maven: pom.xml:

A continuación exponemos el archivo de configuración de Maven, se presupone que el lector ya tiene nociones de Maven.

Script de creación de la tabla de ejemplo sobre MySQL:

Si no lo has borrado, MySQL tiene un esquema llamado test, vamos a crear un tabla en dicho esquema para este ejemplo.

Producto:

La siguiente clase representa un producto que el usuario puede comprar a través de la aplicación de comercio electrónico.

Para simplificar el código expongo sólo lo extrictamente necesario con fines de legibilidad.

Las anotaciones sólo serían necesarias para Hibernate 3 con anotaciones.

DAO usando JDBC.

DAO usando Hibernate 3 (con y sin anotaciones).

Archivo de configuración de Spring 2 (applicationContext.xml):

Propiedades de la aplicación (jdbc.properties):

Definición de DataSources (appContextDataSources.xml):

Para el ejemplo de JDBC (appContextJDBC.xml):

Archivo de mapeo de hibernate 3 para los productos (Product.hbm.xml)

Nota: En caso de Hibernate 3 con anotaciones no haría falta.

Para el ejemplo de Hibernate 3 sin anotaciones (appContextHibernate3.xml):

Para el ejemplo de Hibernate 3 con anotaciones (appContextHibernate3Anotaciones.xml):

Probando la aplicación a través de tests con JUnit 4

Ejecutando los tests con Maven: mvn test

Como vemos se han ejecutado correctamente los cuatro tests.

Ahora vemos que ha sucedido en nuestro modelo de datos:

Referencias

Conclusiones

Bueno, como veis Spring no deja de sorprendernos en cuanto a su potencia y ventajas en el desarrollo de software de calidad (bajo acomplamiento, alta cohesión, etc.)

Espero que os haya parecido útil este tutorial.

Desde mi punto de vista lo realmente importante es comprender lo que hay detrás de cada tecnología y no convertirse en una simple máquina repetidora de recetas o rellena curriculum… los tutoriales no son libros, sólo se exponen un fragmento de lo que la tecnología permite, así queda en mano de cada uno pasarse horas y horas investigando al respecto.


Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

cgpcosmad@gmail.com

Dejar respuesta

Please enter your comment!
Please enter your name here