Relaci贸nes @ManyToMany

Las relaciones Mucho a Muchos (@ManyToMany) se caracter铆zan por Entidades que est谩n relacionadas con a muchos elementos de un tipo determinado, pero al mismo tiempo, estos 煤ltimos registros no son exclusivos de un registro en particular, si no que pueden ser parte de varios, por lo tanto, tenemos una Entidad A, la cual puede estar relacionada como muchos registros de la Entidad B, pero al mismo tiempo, la Entidad B puede pertenecer a varias instancias de la Entidad A.

as

Path params con @PathParam

JAX-RS Path params con @PathParams

Por incre铆ble que parezca, en REST la URL puede proporcionar una de las principales fuentes de informaci贸n para los servicios, pues es posible definir como par谩metros de entrada ciertas parte de la URL, lo que nos permite en primer lugar, crear m茅todos especiales para atender ciertas URL, pero por otra parte, esos fragmentos de URL pueden ser inyectados como par谩metros a los m茅todos Java.

as

Trabajar con objetos pesados @Lob

Tutorial de JPA @LobJPA nos permite mediante la anotaci贸n @Lob mapear con la base de datos objetos pesados, como podr铆a ser im谩genes, xml, binarios, cadenas de texto extensas, json, etc. Cualquier objeto que pueda tener un tama帽a muy grande o de longitud indefinida.

 

@Lob

 

La anotaci贸n @Lob es lo 煤nico que se requiere para indicarle a JPA que ese campo es un objeto pesado y que debe de tratarse como tal. Por lo general se utiliza con los arreglos de bytes, ya que permite almacenar cualquier cosa.

La anotaci贸n @Lob no tiene ning煤n atributo, por lo que solo ser谩 necesario definirla para que funcione. Otro punto importante es que esta anotaci贸n crear谩 una columna de tipo longblob en mysql y podr铆a variar seg煤n el manejador de base de datos utilizados, pero al final siempre ser谩 un campo para objetos pesados.

Para poner en pr谩ctica esta anotaci贸n, retomaremos la entidad Employee, en esta ya hab铆amos agregado la propiedad photo聽 de tipo byte[], en la cual vamos a almacenar la foto del empleado, sin embargo, no hab铆amos entrado en detalles. La entidad Employee se ve de la siguiente manera:

as

Estrategias de carga con @Basic

Tutorial de JPA @Basic@Basic es una anotaci贸n que nos permite controlar el momento en que una propiedad es cargada desde la base de datos, evitando que traer valores que no son necesario al momento de cargar el objeto. Esta anotaci贸n es utilizada generalmente para anotar objetos pesados, como una imagen o un archivo binario.

 

@Basic

 

En JPA existe dos conceptos que son claves para entender c贸mo es que JPA carga los objetos desde la base de datos y estos son claves para mejorar el rendimiento de la aplicaci贸n, estos conceptos se explican a continuaci贸n:

  • Lazy loading (Carga demorada): Los objetos de carga demorada no ser谩n cargados desde la base de datos cuando el objeto sea creado, pero ser谩 cargado en cuanto se acceda a la propiedad. De esta manera JPA identifica cuando la propiedad es accedida por primera vez para cargar el valor desde la base de datos.
    • @Basic( fetch = FetchType.LAZY )
  • Eager loading (Carga ansiosa o temprana): Este es la utilizada por default para la mayoria de las propiedades en JPA, a excepci贸n de las colecciones las cuales las analizaremos mas adelante.
    • @Basic( fetch = FetchType.EAGER )

as

Mapeo de fechas con @Temporal

Tutorial de JPA @Temporal

Mediante la anotaci贸n @Temporal es posible mapear las fechas con la base de datos de una forma simple. Una de las principales complicaciones cuando trabajamos con fecha y hora es determinar el formato empleado por el manejador de base de datos. Sin embargo, esto ya no ser谩 m谩s problema con @Temporal.

Mediante el uso de @Temporal es posible determinar si nuestro atributo almacena Hora, Fecha u Hora y fecha, y es posible utilizar la clase Date o Calendar para estos fines. Yo siempre recomiendo utilizar Calendar, pues tiene muchas m谩s operaciones para manipular fecha y hora.

Se pueden establecer tres posibles valores para la anotaci贸n:

  • DATE: Acotara el campo solo a la Fecha, descartando la hora.
    • @Temporal(TemporalType.DATE)
  • TIME: Acotara el campo solo a la Hora, descartando a la fecha.
    • @Temporal(TemporalType.TIME)
  • TIMESTAMP: Toma la fecha y hora.
    • @Temporal(TemporalType.TIMESTAMP)

as

JPA y los m茅todos hashCode & equals

Tutorial de JPA persistence.xmlPor defecto, todos los objetos en Java heredan de la case Object los m茅todos hashCode y equals los cuales sirvan para identificar si dos variables hacen referencia al mismo objeto.
El comportamiento de facto del m茅todo hashCode retorna la posici贸n en memoria de un objeto, y el m茅todo equals compara el hashCode de los dos objetos evaluados, de esta forma, si las dos variables hacen referencia a la misma posici贸n de memoria, entonces se dice que son igual, de lo contrario son diferentes.
En el caso de las Entidades, la implementaci贸n default de estos m茅todos no funciona correctamente, debido a que una Entidad de dice que es igual a otra si se cumplen dos condiciones:

鈥 Los dos objetos son de la misma clase.
鈥 El valor de su ID (@Id) son iguales

Si estas dos condiciones se cumplen entonces las dos entidades son iguales sin importar que no hagan referencia a mismo objeto en memoria. Debido a esto, es que es importante sobrescribir estos dos m茅todos para que eval煤en a una Entidad por las dos condiciones mencionadas.

Implementando los m茅todos hashCode & equals

Algo que me ha llamado mucho la atenci贸n es que a pesar de que estos dos m茅todos son b谩sicos y que se utilizan con regularidad, muchas personas no entienden como trabajan internamente y a煤n menos como sobrescribirlos correctamente, si eres una de esas personas, no te preocupes ya que los IDE鈥檚 ya tiene por default utilidades que nos ayudan a generarlos de forma adecuada.
Lo primero que haremos ser谩 abrir la entidad Employee que hemos venido trabajando a lo largo de este tutorial. Luego presionaremos Source > Insert Code del men煤 principal, esto arrojara una peque帽a lista de acciones, seleccionamos la opci贸n equals() and hashCode(). Nos arrojara una pantalla como la siguiente:
M茅todo equals y hashcode as