sábado, 4 de junio de 2011

JPA – Paso 1: definiendo el proyecto y los POJOs

Bueno, hoy vamos a programar algo ligeramente más complejo, para llevar a cabo esto necesitamos haber seguido por lo menos la instalación de los prerequisitos que figuran en las siguientes entradas.
Primero partiremos de un diseño bastante simple, como se observa en la figura sólo tenemos tres entidades, con relaciones uno a muchos desde Empleado y TipoTelefono hacia Agenda, es decir, una instancia de Empleado tiene una o varias instancias de Agenda y una instancia de Agenda sólo tiene una instancia de Empleado, lo mismo es para la relación entre Agenda y TipoTelefono.

image
El modelo anterior es planteado ya que presenta un caso que nos va a permitir explicar una situación medianamente compleja y a la vez ver los procedimientos básicos al trabajar con entidades basadas en POJOs, presenta dos clases con un campo PK, además, entre estas entidades existe una relación muchos a muchos la cual es gestionada por una tercera entidad, Agenda, ya que presenta un campo extra (telefono). Agenda tiene la peculiaridad de tener una PK múltiple, formada por los campos codEmpleado y codTipoTelefono que a su vez son FKs de las clases respectivas, Empleado y TipoTelefono.
El objetivo primero será llevar a cabo la codificación de los POJOs (Plain Old Java Object), es decir, el código para programar este modelo desde el punto de vista de Java y POO sin la intervención de las anotaciones ya que primero vamos a definir claramente la programación de las clases para luego ver el tema de las anotaciones.
Ok, manos a la obra, crearemos un proyecto en Netbeans llamado Agenda, ya que estamos orientado el desarrollo del proyecto hacia la capa de negocios, entonces expondremos los servicios del mismo por medio de un web service, por lo tanto el proyecto será de tipo web application, si desea más información sobre los pasos iniciales a seguir con la creación de un proyecto de ese tipo, revise el tutorial anterior.
Crearemos ahora la clase Empleado, como se observa en el diagrama de clases, bastará con crear una nueva clase Java  de nombre Empleado la cual pondremos en un nuevo paquete llamado clases, además le agregaremos dos propiedades, una llamada codEmpleado con tipo de datos long y otra llamada nombre con tipo de datos String. Observe como preparar los datos en el asistente de creación de propiedades, para llegar a el bastará con presionar Alt+Insertar en la ventana de código fuente y elegir agregar propiedad.
SNAGHTML321b5d SNAGHTML3672cf
Finalmente el código de la clase Empleado terminará como se observa en la siguiente imagen, de manera similar hacemos el código de la clase TipoTelefono, ya que tienen características similares.
SNAGHTML3a6e6c SNAGHTML405467
Aún falta la clase Agenda, el sentido común nos diría que en la clase Agenda tendríamos que definir tres atributos, codEmpleado, codTipoTelefono y telefono, sin embargo postergaremos un momento la creación de la clase Agenda.
Como estamos preparando esta clase para ser persistida por medio de JPA necesitamos tener algunas consideraciones adicionales, la primera será observar que la clase Agenda tiene una PK múltiple, es decir, una PK con más de un elemento constitutivo, claramente no es el caso de Empleado ni TipoTelefono. En situaciones de este tipo es necesario crear una clase extra de soporte para la contención de los atributos que van a constituir la PK, a esta clase la llamaremos PKAgenda y le crearemos dos propiedades, codEmpleado y codTipoTelefono, además un constructor con parámetros y uno sin parámetros, estos dos con el fin de manejar las instancias de la clase de manera rápida.
SNAGHTML73f883
Ahora si podemos crear la clase Agenda, su primer atributo será una instancia de la clase PKAgenda, y como segundo atributo tendremos al telefono, como la instancia de la clase PKAgenda ya contiene dos atributos (codEmpleado y codTipoTelefono) entonces tenemos la clase Agenda con tres elementos, codEmpleado, codTipoTelefono y telefono.
Para crear un atributo con la instancia de una clase, el asistente de creación de propiedades deberá lucir como sigue:
SNAGHTML769474
Luego creamos, como en pasos anteriores, el atributo telefono, le pondremos como tipo de datos String con el fin de flexibilizar el ingreso de datos al campo telefono. La clase Agenda deberá lucir como en la siguiente imagen.
SNAGHTML79cc45
Muy bien, por lo visto hemos terminado con la definición de las clases para persistencia… o no?. Si observamos detalladamente el modelo, tenemos todas las clases planteadas por el mismo, claro que tenemos una clase extra llamada PKAgenda, clase de soporte que esta fuera del modelo. La pregunta persiste, terminamos con la implementación del modelo? o no?.
La respuesta es no, debido a que en el modelo aún están presentes las relaciones entres las clases y son estas relaciones las que aún no hemos modelado. Por ejemplo, veamos la relación y la multiplicidad existente entre las clases Empleado y Agenda, si tomamos el punto de vista de la clase Empleado vemos que Empleado puede tener varias instancias de la clase Agenda (varios números de teléfono), de ahí que en el lado de Agenda tengamos la multiplicidad en muchos (*). Si analizamos la multiplicidad desde el lado de Agenda notamos que una instancia de Agenda sólo puede tener una instancia de Empleado, ya que un número de teléfono sólo le pertenece a un empleado.
Del breve análisis anterior podemos afirmar que las clases Empleado y TipoTelefono tienen como atributos colecciones de objetos Agenda, así como la clase Agenda tiene como atributos una instancia de la clase Empleado y una instancia de la clase TipoTelefono. Para llevar a cabo esto haremos uso del asistente, al momento de insertar los atributos tendremos que usar el asistente de la siguiente manera.
SNAGHTML130653d SNAGHTML1414e25
En caso de presentar algún error, le damos clic al ícono del foco a la izquierda de la línea de código que arroja el error, entre las sugerencias propuestas por Netbeans, elegimos la opción de agregar import para java.util.Collection o lo agregamos manualmente.
SNAGHTML131de53
Con estos sencillos pasos podemos afirmar que ya tenemos implementado, al menos a nivel de POJOs, todo el modelo, en el siguiente artículo veremos en detalle como ir agregando las anotaciones respectivas con el fin de convertir esta implementación en las entidades que finalmente serán persistidas

1 comentario: