Objetos de acceso a datos - DAOs

La interfaz info.joseluismartin.dao.Dao extiende PageableDataSource y añade las clásicas operaciones CRUD (create, retrieve, update, delete) sobre entidades.

Algunos programadores prefieren utilizar Daos genéricos mientras otros prefieren generalizar únicamente los métodos de recuperación. Ambos estilos están disponibles en la interfaz Dao que proporciona los siguientes métodos genéricos de recuperación de entidades:

Además de los métodos de recuperación de la entidad por defecto.

Las tres implementaciones de la interfaz Dao que proporciona JDAL son thread safe por lo que normalmente se despliegan en el contexto de la aplicación como singletons.

Aunque es posible utilizar JDAL sin el contenedor IoC que proporciona springframework, la librería se ha diseñado bajo los principios de DI (inyección de dependencias) y es considerablemente más fácil utilizarla sobre este contenedor.

JDAL Core define el Namespace http://www.jdal.org/schema/jdal que simplifica la definición de servicios de persistencia en el fichero de definición de beans del contenedor de spring framework.

Por ejemplo, para disponer de un Dao para para la entidad JPA org.example.Entity basta con declarar el servicio en fichero de configuración del contexto de la aplicación:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jdal="http://www.jdal.org/schema/jdal"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.jdal.org/schema/jdal http://www.jdal.org/schema/jdal/jdal-core.xsd"
        default-init-method="init">
 
 
    <!-- Daos -->
    <jdal:service entity="org.example.Entity" />
 
   </beans>

Filtros

Es habitual al solicitar modelos de datos a un repositorio, disponer de algún método que nos permita filtrar los resultados. JDAL permite obtener resultados paginados de los servicios de persistencia mediante dos objetos de usuario: Filter y CriteriaBuilder.

En la mayoría de las ocasiones, estos son las dos únicas clases que el usuario de la librería necesita programar en la capa de acceso a datos de la aplicación. He puesto especial interés en simplificar lo máximo posible esta tarea que es específica de cada aplicación.

Como puede ver en el diagrama, las implementaciones de la interfaz Dao contienen un mapa que asocia CriteriaBuilders con un nombre (String). La responsabilidad de un CriteriaBuilder es crear un Criteria en el caso de que estemos utilizando Hibernate o un CriteriaQuery en el caso de que estemos utilizando JPA.

La interfaz Filter proporciona los datos de filtrado que se van a utilizar en la creación de cada tipo de Criteria. La selección del CriteriaBuilder asociado a cada tipo de filtro se hace en función del nombre del filtro. (ie, filter.getFilterName()).

La clase BeanFilter es una clase base para crear filtros como simples JavaBeans

Las clases JpaCriteriaBuilderSupport y AbstractCriteriaBuilder proporcionan plantillas (Templates) con el objeto de simplificar la creación de constructores de Criterias para JPA e Hibernate.

Finalmente, los constructores de Criterias se pueden declarar en el contexto de la aplicación mediante el elemento <jdal:criteria> que permite especificar el nombre del constructor mediante el atributo name y una referencia a un bean definido en el contexto mediante el atributo builder

Los constructores de criterias, no son la única forma de obtener resultados filtrados. Dependiendo del tipo específico del Dao se soportan otros sistemas que dependen de la implementación. A continuación sigue el algoritmo que sigue HibernateDao al recibir una petición de página que incluye un filtro.

En el caso de JpaDao, si el nombre del filtro coincide con una consulta definida (NamedQuery) se ejecutará la consulta aplicando como parámetros filter.getParamenterMap()


Ejemplos


En este punto es recomendable echarle un vistazo a la explicación de la capa de integración de la aplicación de ejemplo de JDAL.

Alternativamente, también puede ver ejemplos de código de JDAL Core en el paquete info.joseluismartin.gefa.dao de la aplicación GEFA, actualmente en desarrollo, bajo licencia GPL v3 que se encuentra alojada en GitHub.

Si desea hacer alguna pregunta o comentario, puede hacerlo en el foro de soporte de JDAL, intentaré responderle tan pronto como me sea posible.