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 )

Lazy loading se logra mediante la utilizaci贸n del patr贸n de dise帽o Proxy, el cual tambi茅n explico con m谩s detalle en mi libro.

 

La anotaci贸n @Basic define adem谩s la propiedad optional, la cual es de tipo booleano, si se le indica true, se decimos a JPA que esta propiedad es opcional y en ella puede haber un valor Null, en caso se ser false, le indicamos que la propiedad siempre deber谩 tener valor. Esta propiedad es m谩s que nada para ayudar a JPA a optimizar los query para obtener los valores. Pero tendr谩 que corresponder con la realidad, ya que en caso de marcar que no es opcional y este valor es null en la base de datos JPA marca error.

 

NOTA: optional聽 es diferente聽 de nullable聽 de @Column, pues nullable sirve para definir la estructura de la columna y optional son sugerencias a JPA para optimizar los querys. Nunca debemos de confundir eso.

 

Un punto importante es que @Basic se puede emplear pr谩cticamente para cualquier como tipos primitivos, clases wrapper, Calendar, enums, Time, Date, Timestamp. byte[], char[], clases que implementan java.lang.Serializable, etc.

 

Ya con toda la teor铆a, pasaremos a ponerla en pr谩ctica. Ret贸menos la clase Employee que hemos utilizando en todos el tutorial para agregar una nueva propiedad llamada photo, esta ser谩 de tipo bute[] y guardara el binario de la foto del empleado. La foto al ser un campo pesado lo marcaremos como LAZY, para evitar que se cargue al crear el objeto y solo cuando sea necesario se cargue. Por otra parte, la foto del empleado no es obligatoria por lo que definiremos la propiedad optional = true.聽 Veamos c贸mo quedar铆a:

 

 

Veamos que la anotaci贸n @Column se define para indicar el nombre de la columna de la base de datos y est谩 definida la propiedad nullable=true debido a que la foto no es obligatoria. Recordemos la diferencia entre nullable & optional que ya analizamos.

 

NOTA: En la siguiente secci贸n describiremos la anotaci贸n @Lob, por lo pronto solo dej茅mosla pasar por alto.

 

Finalmente, y tras ejecutar la aplicaci贸n para creer las tablas, veremos que la tabla queda de la siguiente manera:

 

@Basic

 

La columna PHOTO se ha creado de tipo Longblob debido a que la propiedad es de tipo byte[] y puede ser de gran tama帽o.

 

NOTA: Este art铆culo es solo una secci贸n del Tutorial de JPA, para ver el contenido completo de este tutorial regresa al 脥ndice en el bot贸n de abajo.

 

Anterior脥ndiceSiguiente

Art铆culos relacionados

JPA, Hibernate VS JDBC Los que ya han tenido la oportunidad de trabajar con alg煤n ORM como JPA o Hibernate sabr谩n las bondades que tiene ya que nos permite desarrollar de un...
Definici贸n de columnas con @Column Una de las principales caracter铆sticas cuando trabajamos con base de datos es que todas las tablas tienen Columnas, y dichas columnas esta mapeadas co...
Entity Manager & Persistence Context Hasta el momento solo hemos trabajado con el Entity Manager para realizar las operaciones b谩sicas, pero existen detalles m谩s finos que es necesario en...

Oscar Blancarte

Ideol贸gico, Innovador y emprendedor, Padre, Tecn贸logo y Autor, amante de la ciencia y la tecnolog铆a en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultor铆a. Amante de la programaci贸n y el Ajedrez.

2 comentarios en “Estrategias de carga con @Basic

  1. Buenas Oscar.
    De nuevo, enhorabuena por tu blog, y toda la info de JPA. Yo lo que he observado en los proyectos en los que he utilizado JPA en la capa de persistencia, es que hay que tener cuidado cuando utilizamos LAZY o EAGER y estamos debugeando, de no despistarnos al ver que normalmente nos llega a null o vac铆o un campo que tenemos definido como lazy y luego al finalizar de debugear y ejecutar la aplicaci贸n, vemos que efectivamente no es ni null ni vac铆o, sino que al ser lazy nos llega a posteriori.

    Saludos.

    1. Hola Silvia, esa es una buena observaci贸n, cuando utilizamos LAZY, JPA en realidad lo que hace es agregar un Proxy, este proxy lo que hace es que no contiene al valor como tal, sino que esta implementado para que al momento de obtener los datos es los consulte en la base de datos. Cuando debugeamos normalmente estas herramientas introspecta (Reflection) los objetos para darnos los datos que tiene, de esta forma puede que el valor sea null por que el valor no es le铆do por lo m茅todos de acceso get, de esta forma, el proxy no se entera y no carga el valor al momento de verlo en el debuger.

      Otro problema habitual es leer el valor fuera de la capa de servicios, por ejemplo, si pasas la Entity de un EJB a un Controller de JSF e intentas cargar un atributo que es LAZY y no lo hab铆as cargado antes, entonces te marcara error, porque ya no estar谩s dentro del contexto de persistencia.

Deja un comentario

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *