ORM (Object Relational Mapping) es el nombre con el que se conoce la técnica de mapear registros de una base de datos relacional a entidades de un lenguaje de programación orientado a objetos como es Java. Spring ofrece la posibilidad de aplicar esta técnica utilizando todas las soluciones más reconocidas actualmente, como por ejemplo Hibernate.

Spring ofrece integración con especificaciones como JPA y JDO, que son las tecnologías que implementan esta técnica, la primera orientada a base de datos relacionales, y la segunda a cualquier tipo de recursos.

Dependencias

Para realizar los ejemplos de esta parte se requiere incluir la librería ORM de Spring y de Hibernate como dependencias en el fichero pom.xml de Maven:

Por lo demás, se seguirá utilizando la base de datos Oracle XE de los ejemplos anteriores, por lo que es necesario mantener las correspondientes dependencias, en especial del driver.

Hibernate

Spring recomienda atacar directamente el API nativo de Hibernate, por lo que es recomendable hacer un repaso rápido de los conceptos básicos de funcionamiento de esta librería.

Hibernate soporta varias formas de configuración, entre ellas una que consiste en utilizar un fichero llamado hibernate.cfg.xml donde se le indica, entre otros, los parámetros de conexión a base de datos:

El último parámetro de la configuración hace referencia al fichero Empresa.hbm.xml donde se encuentra definido el mapeo entre la tabla de empresas y su correspondiente objeto POJO:

No obstante, Hibernate soporta también el uso del paquete de anotaciones de persistencia estándar, por lo que un ejemplo más actual eliminaría el fichero Empresa.hbm.xml de la configuración por una referencia a la clase directamente:

Y toda la configuración del mapeo se especificaría en la propia clase utilizando las anotaciones del paquete estándar javax.persistence:

Con esta configuración básica ya se podría acceder a la tabla de empresas para hacer una consulta por HQL de todos los registros, que Hibernate automáticamente mapeará en entidades:

Un último detalle es pensar que en vez de una conexión JDBC directa, en un servidor de aplicaciones lo normal será utilizar un DataSource.

En cualquier caso, lo importante es observar como toda la gestión de sesiones y transacciones vuelve a estar en manos del desarrollador.

Integración

Toda la configuración y código del apartado anterior es exclusivamente de Hibernate. ¿Donde interviene Spring entonces? Pues hay algunas pistas evidentes, por ejemplo sessionFactory es un buen candidato a ser un bean de tipo Singleton:

La clase LocalSessionFactoryBean pertenece al paquete de integración de Spring para Hibernate, y permite referenciar a un DataSource, especificar opciones de configuración, e incluso autoescanear un paquete de clases en busca de entidades.

El siguiente paso lógico es inyectar el bean en un DAO, usando anotaciones por ejemplo:

Sin embargo, llegado este punto, aún sería responsabilidad del desarrollador la apertura de sesión y la gestión de transacciones. Lo que evidentemente es un tarea adecuada para dejarla en manos de la infraestructura de Spring:

La clase HibernateTransactionManager forma parte también del paquete de integración de Spring para Hibernate. Gracias a ella se abrirá automáticamente una sesión y se realizará la gestión de transacciones sin intervención del desarrollador:

Spring ofrece también una clase HibernateTemplate, con una filosofía de funcionamiento similar a las que se vieron para JDBC, pero su uso está desaconsejado por los propios desarrolladores de Spring, que prefieren que se realicen llamadas al API nativo de Hibernate directamente.