Por Javier Cuervas
Tercera entrega de las características de Spring Framework. Aunque cada vez está más extendido el uso de Spring Boot como alternativa a Spring Framework por su simplicidad y ahorro de configuración, es interesante entender cómo funciona y aquí tienes algunas de las claves.
Añadir contenido estático
Si queremos añadir imágenes, ficheros o cualquier recurso, debemos indicarle a Spring dónde ir a buscarlos mediante la siguiente etiqueta en el fichero de configuración xml del dispatcher:
En este caso le estamos diciendo que la carpeta raíz se llama “recursos”, que podemos hacer referencia al mapeo con el mismo nombre “recursos” y que dentro puede contener cualquier tipo de contenido. Para hacer referencia a esta ruta desde una vista, tendremos que utilizar la siguiente Expression Language (EL) JSP, que indica la ruta relativa del contexto de la aplicación seguido de la ruta y nombre de nuestro recurso:
O bien usar la etiqueta JSTL <c:url> y especificar directamente la ruta relativa:
JNDI
La Interfaz de Nombrado y Directorio Java es una Interfaz de Programación de Aplicaciones de Java para servicios de directorio. Permite a los clientes descubrir y buscar objetos y datos a través de un nombre y de este modo facilitar el acceso a base de datos.
Necesitamos por tanto primero crear un recurso JDBC de tipo DataSource en el fichero web.xml:
Para luego referenciarlo mediante el nombre JNDI desde el fichero de configuración:
Por último, habría que incluir en el fichero de configuración context.xml del servidor Tomcat, el recurso DataSource con la información de la conexión de base de datos:
La capa de Servicio
Se trata de clases envoltorio o wraper para las clases DAO, de modo que permita desacoplar aún más nuestra aplicación, pudiendo implementar una lógica específica sin necesidad de modificar las clases DAO. Por ejemplo si tuviéramos que hacer una select compleja con filtros, lo haríamos en una clase de Servicio que implemente la clase DAO. La idea es que las clases DAO contengan solo operaciones CRUD (Create, Read, Update, Delete).
Hibernate
Se trata de un framework de persistencia de datos open source, que permite realizar el mapeo relacional de objetos y operaciones de BD mediante sentencias SQL y HQL (Hibernate Query Language). La versatilidad o ventajas de usar este tipo de frameworks, es que podemos prescindir de utilizar lenguaje SQL de forma explícita gracias al mapeo que realiza entre los objetos y sus atributos con las tablas y campos de la base de datos.
Hibernate es una implementación del estándar JPA (Java Persistence API) que es un framework del lenguaje de programación Java que maneja datos relacionales en aplicaciones usando la Plataforma Java en sus ediciones Standard (Java SE) y Enterprise (Java EE) con sus respectivas anotaciones. JPA se origina a partir del trabajo de la especificación de EJB3 para no perder las ventajas de la orientación a objetos y permitir usar objetos regulares (conocidos como POJO).
El objetivo original de Hibernate era ofrecer mejores capacidades de persistencia que las ofrecidas por EJB2, simplificar las complejidades y complementar algunas características necesarias.
Existen muchas otras implementaciones de JPA:
-
Hibernate
-
ObjectDB
-
TopLink
-
CocoBase
-
EclipseLink
-
OpenJPA
-
Kodo
-
DataNucleus, antes conocido como JPOX
-
Amber
Las librerías que se manejan para poder hacer uso de este framework son:
Gracias al patrón DAO y la capa de Servicio, podemos sustituir de forma sencilla la implementación la capa de persistencia y el tipo de acceso a base de datos. Bastaría con crear una nueva clase con los métodos CRUD.
Para comenzar a usar Hibernate en nuestro proyecto Spring es necesario configurar el fichero de configuración xml, incluyendo el name space de transaccionalidad TX para habilitar transacciones con Hibernate.
Deberemos añadir un Bean como factoría de sesiones Hibernate de tipo LocalSessionFactoryBean, que será implementado en nuestros DAOs con inyección de dependencia:
De esta forma lo inyectamos:
Añadiremos también un Bean que permitirá manejar y traducir excepciones Hibernate en excepciones Spring y otro Bean para habilitar las transacciones en Hibernate:
Anotaciones JPA
Con las anotaciones JPA sobre las clases POJOS, realizamos el mapeo entre las clases y atributos con las tablas y campos de base de datos. Esto junto con la configuración anterior en el fichero xml, nos permitirá ahorrarnos escribir nada de código MySql como era el caso de JDBC:
@Entity -> Identifica que la clase Java será una tabla
@Table(name=””) -> Indica el nombre de la tabla a la que corresponde en Base de datos
@Id -> Indica que será un campo clave
@Column(name=””) -> Indica el nombre del campo de base de dato al que corresponde el atributo
@GeneratedValue -> Indica que será un valor autoincremental
Algunos ejemplos de métodos de Hibernate a través de SessionFactory:
Ejemplo relación 1 a muchos
Si queremos representar una relación de 1 a Muchos como la siguiente:
Debemos anotar ambas clases de la siguiente forma:
De modo que la clase Direccion contiene un atributo de tipo Admin, que representa el dueño de esa dirección y se indica el nombre de la columna en base de datos “idAd” con @JoinColumn, además de anotarlo con @ManyToOne para indicarle que un administrador puede tener una lista de direcciones.
Por otra parte, la clase Admin contiene un atributo de tipo Direccion que representa una lista de direcciones y que se anota con @OneToMany y el nombre del atributo que lo relaciona en la clase Direccion.
Para ver todas las direcciones de un administrador con Hibernate, lo haríamos así:
Esto equivaldría en lenguaje SQL a:
Referencias
Página oficial de Spring
Canal Youtube "MitoCode":
Canal Youtube "PildorasInformaticas":