Mapeo de enumeraciones con @Enumerated

Tutorial de JPA @EnumeratedUna de las ventajas de utilizar enumeraciones en Java, es podemos limitar los valores posibles para una propiedad, forzando a los desarrolladores a utilizar los valores ya definidos y evitando el margen de error.

@Enumerated

Con JPA también es posible utilizar enumeraciones y pueden ser de mucha ayuda para asegurar que los programadores persistan un valor válido dentro de una lista previamente definida. JPA nos permite mediante la anotación @Enumerated definir la forma en que una enumeración será persistida, las cuales se explican a continuación:

  • String: permite persistir la enumeración por su nombre, lo que significa que será una columna alfanumérica. La anotación quedaría así:
    • @Enumerated(value = EnumType.STRING)
  • Ordinal: esta estrategia persiste un valor entero que corresponde al valor ordinal o posición de valor en la enumeración. La anotación quedaría de la siguiente manera:
    • @Enumerated(value = EnumType.ORDINAL)

Retomaremos la entidad Employee que hemos venido analizando en todo este tutorial y le agregaremos una nueva propiedad que corresponda al status:

as

Definición de columnas con @Column

Tutorial de JPAUna de las principales características cuando trabajamos con base de datos es que todas las tablas tienen Columnas, y dichas columnas esta mapeadas contra los atributos de las entidades, para lo cual es necesario que JPA identifique que columna mapea contra cada atributo de la clase y es aquí donde entra @Column.

@Column

La anotación @Column nos permitirá definir aspectos muy importantes sobre las columnas de la base de datos de la base de datos como lo es el nombre, la longitud, constrains, etc. En caso de no definir esta anotación en los atributos, JPA determinara el nombre de la columna de forma automática mediante el nombre del atributo, por lo que siempre es recomendable establecer esta anotación en todos los atributos de la clase y evitarnos problemas. as

Llaves compuestas con @IdClass

Tutorial de JPA @IdClassExisten ocasiones en donde se requieres marcar más de un campo como @Id, conformando con esto una llave primaría compuesta. En estos casos se requiere complementar la entidad con una clase adicional que será utilizada como ID y además tendrá que ser referenciada desde la clase donde se requiere una llave compuesta.

La utilización de @IdClass es una de las dos opciones para definir llaves primarias compuestas, y esta consiste en crear una clase adicional únicamente con los campos que corresponden a la llave primaria.
Veamos un caso concreto, normalmente un empleado puede tener más de un teléfono, entonces, podríamos crear una tabla donde la llave primaria sea el ID del empleado y el tipo de teléfono, de esta forma nos aseguramos de tener solo un tipo de teléfono por empleado. Veamos cómo quedaría la clase ID: as

Definir llave primaría con @Id

Tutorial de JPA @IdAl igual que en las tablas, las entidades también requieren un identificador(@Id ), dicho identificador deberá de diferenciar a la entidad del resto. Como regla general, todas las entidades deberán definir in ID, de lo contrario provocaremos que el EntityManager marque error a la hora de instanciarlo.

El ID es importante porque será utilizando por EntityManager a la hora de persistir un objeto, y es por este que puede determinar sobre que registro hacer el select, update o delete. JPA soporta ID simples de un solo campo o ID complejos, formados por más de un campo, sin embargo, esta sección abordaremos únicamente los ID simples y abordaremos las llaves compuestas en la siguiente sección del tutorial.

as

Mapeo de tablas con @Table

Tutorial de JPA @TableEn la sección hablaremos de la anotación @Table  y su importancia a la hora de definir entidades. La anotación @Table es utilizada para indicarle a JPA contra que tabla debe de mapear una entidad, de esta manera cuando se realice una persistencia, borrado o select de la entidad, JPA sabrá contra que tabla de la base de datos deberá interactuar.

Anotación @Table

Como comenté, esta anotación se utiliza para indicar la tabla contra la que mapea la entidad, pero también tiene otras propiedades interesantes como las que se muestra a continuación:

  • name: se utiliza para poner el nombre real de la tabla en la base de datos, es recomendable que el nombre sea exacto respetando mayúsculas y minúsculas, sobre todo cuando trabajamos en Linux.
  • schema: se utiliza para indicar el schema en el que se encuentra la tabla. Esta propiedad por lo general no es necesaria, a menos que la tabla se encuentre en un schema diferente al que utilizamos para logeamos.
  • Indexes: JPA permite indicar los índex que tiene nuestra tabla, esta opción toma relevancia cuando indicamos que JPA cree las tablas por nosotros (más adelante veremos esta característica).

Veamos cómo quedaría @Table en la entidad Employee que revisamos en la unidad pasada: as

Declarar entidades con @Entity

Tutorial de JPA @EntityUna de las grandes ventajas de JPA es que nos permite manipular la base de datos a través de objetos, estos objetos son conocidos como Entity, las cuales son clases comunes y corrientes también llamada POJO’s (Plain Old Java Objects), estas clases tiene la particularidad de ser clases que están mapeadas contra una tabla de la base de datos, dicho mapeo se lleva a cabo generalmente mediante Anotaciones. Dichas anotaciones brindan los suficientes metadatos como para poder por relacionar las clases contra las tablas y las propiedades contra las columnas. Es de esta forma que JPA es capaz de interactuar con la base de datos a través de las clases.

A lo largo de este capítulo y los siguientes estaremos estudiando las diversas anotaciones que nos permitirán crear nuestras Entity así como relacionar entidades con otras.

Anotación @Entity

Como ya discutimos hace un momento, las entidades son POJO’s por lo que son simples clases Java como cualquier otra, sin embargo, JPA debe de ser capaz de identificar que clases son Entity para de esta forma poderlas administrar. Es aquí donde nace la importancia de la anotación @Entity, esta anotación se debe de definir a nivel de clase y sirve únicamente para indicarle a JPA que esa clase es una Entity, veamos el siguiente ejemplo:

package com.obb.jpa.jpaturorial.entity;

import java.util.Calendar;

/**
 *
 * @author Oscar Blancarte
 */
public class Employee {
    private Long id;
    private String name; 

    /**
     * GETs and SETs
     */
}

as

EntityManager y el archivo persistence.xml

Tutorial de JPA persistence.xmlEn esta sección hablaremos de cómo crear el archivo persistence.xml y como establecer conexión con la base de datos. Cabe mencionar que para fines de practicidad estaremos trabajando con MySQL, el Gestor de bases de datos relacional más popular del mundo y que además tiene una versión gratuita, por lo cual será necesario que descarguemos e instalemos MySQL, así como el cliente workbench que los puedes descargar directamente desde la página oficial de MySQL.

as

Crear un proyecto JPA

Tutorial de JPAEn la actualidad existe diversos IDE’s que nos permitirán crear proyecto JPA y en general todos ofrecen las mismas opciones por lo que en realidad sea cual sea el IDE que quieras utilizar tendrá el mismo resultado, sin embargo, para este tutorial utilizaremos NetBeans, el cual lo puedes descargar en http://netbeans.org. NetBeans es un proyecto OpenSource por lo que lo podrás descargar libremente y sin ningún costo.

Ahora bien, para maximizar la portabilidad y facilitar las librerías utilizaremos un Maven, la cual es una herramienta para la gestión de dependencias y construcción de proyectos similar a Apache Ant, aunque más potente. Si quieres aprender más de Maven te recomiendo el libro Maven: The Definitive Guide.

Por el momento no te preocupes si no has trabajado con NetBeans o Maven, ya que aquí mismo te diremos paso a paso como hacer todos los pasos para configurar tu proyecto.

Creando un proyecto Maven

Lo primero que tendremos que hacer será abrir NetBeans y en el menú superior pincharemos la opción File >New Project  y nos arrojara la siguiente pantalla:

Projecto JPA - Nuevo as

JPA, Hibernate VS JDBC

JPA HIBERNATE JDBCLos 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 una forma mucho mas rápida y con muchos menos errores en tiempo de ejecución ya que nos permite modelar nuestras entidad como Clases Java las cuales serán convertidas a las instrucciones Insert, Update o Select según sea la operación a realizar. Claro que todas estos beneficios tiene un costo y es que el performance se degrada debido a todas las conversiones que se tiene que hacer para convertir las Entity en Querys y los ResultSet pasarlos a clases ademas que cada registro representa un Objeto en memoria que tendrá as