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.

Creaci贸n del archivo Persistence.xml

Una vez instalado MySQL procederemos a la creaci贸n del archivo persistence.xml, para lo cual seleccionaremos la opci贸n File > New File y aparecer谩 la siguiente pantalla; en ella ubicamos la categor铆a Persistence y luego el archivo Persistence Unit, tal como aparece en la imagen:

persistence.xml - file

Presionamos Next y nos arrojara una nueva pantalla, en esta definimos el nombre de la unidad de persistencia, la implementaci贸n de JPA, la conexi贸n a la base de datos y la estrategia de generaci贸n de las tablas.

M谩s adelante analizaremos las unidades de persistencia y las estrategias de generaci贸n de las tablas, por el momento solo ser谩 necesario prestar atenci贸n en el nombre con el que crearemos la unidad de persistencia y la configurar la conexi贸n a la base de datos, llenemos el formulario como en la siguiente imagen:

persistence.xml - new connection

Finalmente ser谩 necesario crear la conexi贸n a la base de datos, para esto seleccionaremos el campo Database Connection y seleccionaremos la opci贸n New Database Connection, esto nos arrojar谩 una nueva venta donde deberemos seleccionar el driver de MySQL tal como aparece en la siguiente imagen:

persistence.xml - jdbc driver

Presionamos en el bot贸n Next y nos arrojara una nueva pantalla donde definiremos los datos de conexi贸n a la base de datos, para esto deber铆amos tener ya creada una base de datos llamada JPATutorial y tener acceso a ella por medio de un usuario de MySQL, en mi caso, cree un usuario llamado JPA, pero tu podr铆as utilizar el root o cualquier otros, lo importante es que exista una base de datos donde podremos crear tablas y realizar las operaciones b谩sicas sobre ellas. Una vez definidos los datos de conexi贸n presionaremos Test Connection para asegurar que la conexi贸n a la base de datos fue exitosa y presionamos Finish. Esta acci贸n nos regresara a la pantalla anterior donde nuevamente presionaremos Finish. Esto concluir谩 con la generaci贸n del archivo.

Un detalle sumamente importante acerca de este archivo es que debe estar en la carpeta META-INF聽 , de lo contrario no ser谩 localizado cuando el API de JPA inicie.

NetBeans nos da la opci贸n de manipular el archivo persistence.xml de forma gr谩fica y en texto plano, por lo cual abriremos el archivo y en la parte superior cambiaremos del modo Design al modo Source para analizar su contenido:

Por el momento pongamos foco en el nombre de la unidad de persistencia, en este caso llamada JPA_PU聽 , seguido veamos que en la secci贸n de properties se encuentran todos los datos de conexi贸n a la base de datos, como el driver, cadena de conexi贸n, usuario y password, los cuales ser谩n cargados en tiempo de ejecuci贸n para establecer la conexi贸n a la base de datos. Finalmente veamos la 煤ltima propiedad schema-generation.database.action con un valor de create,聽 esta propiedad es la estrategia para la generaci贸n de las tablas, lo que quiere decir que JPA creara de forma autom谩tica todas las tablas requeridas de forma autom谩tica mediante la definici贸n de las Entidades. M谩s adelante analizaremos las ventajas de esta propiedad.

 

NOTA: En algunas versiones de MySQL es requerido agregar el par谩metro &serverTimezone=UTC al final de la l铆nea 6. Al final de esta secci贸n ejecutaremos la aplicaci贸n, si por alguna raz贸n te sale un error, intenta agregar este par谩metro. En caso de no funcionar puedes escribirme el error en los comentarios.

 

Introducci贸n a la clase EntityManager

JPA tiene como interface medular al EntityManager, el cual es el componente que se encarga de controlar el ciclo de vida de todas las entidades definidas en la unidad de persistencia, y es mediante esta interface que se pueden realizar las operaciones b谩sicas de una base de datos, como consultar, actualizar, borrar, crear (CRUD). Tambi茅n es la clase por medio de la cual se controlan las transacciones.

Los EntityManager son configurados siempre a partir de las unidades de persistencia definidas en el archivo persistence.xml y es posible crearlas de dos formas las cuales depender谩n del tipo de aplicaci贸n:

  • Aplicaci贸n de escritorio: En el caso de ejecutar nuestro programa como una aplicaci贸n de escritorio o stanalone ser谩 necesario instanciar el EntityManager a trav茅s de la clase EntityManagerFactory. En la primera parte de este tutorial estaremos utilizando este m茅todo. Un detalle importante de este m茅todo es que el programador es el responsable de abrir y cerrar las transacciones.
  • Aplicaciones Empresariales: Cuando nuestra aplicaci贸n vive dentro de una Application Server o precisamente en un EJB Container, los EntityManager se referencia por medio de Inyecci贸n de dependencias (CDI), utilizando la anotaci贸n @PersistenceContext聽, de este modo, el Application Server es el encargado de la creaci贸n de los EntityManager para su inyecci贸n. Un detalle interesante de este m茅todo es que el Application Server se puede encargar de forma autom谩tica de las transacciones, abriendo una transacci贸n al inicio de la ejecuci贸n de un m茅todo de negocio y cerrando la transacci贸n autom谩ticamente al finalizar la invocaci贸n del m茅todo. M谩s adelante analizaremos este m茅todo.

Cabe mencionar que JPA est谩 铆ntimamente relacionado en la especificaci贸n de EJB 3.X, por lo que JPA toma m谩s sentido cuando lo utilizamos en entornos empresariales, sin embargo, al inicio de este tutorial empezaremos utiliz谩ndolo en aplicaciones de escritorio, debido a que es mucho m谩s f谩cil, sin embargo, a medida que avancemos nos iremos aventurando a utilizar JPA en aplicaciones empresariales.

 

Instanciando un EntityManager

Como a lo largo de este tutorial esteremos instanciando frecuentemente al EntityManager crearemos una clase gen茅rica que estaremos reutilizando a lo largo de todo el tutorial.

Creemos una nueva clase llamada EntityManagerUtil dentro del paquete com.obb.jpa.jpaturorial.util que deber谩 de quedar de la siguiente manera:

Entendamos que est谩 pasando, en la l铆nea 13 se obtiene una instancia de la Interface EntityManagerFactory, mediante la clase Persistence, esta 煤ltima recibe como par谩metro el nombre de la unidad de persistencia que definimos en el archivo persistence.xml. una vez con el EntityManagerFactory se obtiene una instancia de EntityManager para finalmente ser retornada para ser utilizada.

Una de las cosas interesantes de JPA es que es una especificaci贸n por tal motivo no existe como tal una implementaci贸n 煤nica, es por eso que el EntityManagerFactory tiene la responsabilidad de obtener la implementaci贸n concreta del EntityManager provista por el proveedor. Por lo que la clase concreta devuelta por el m茅todo createEntityManager del EntityManagerFactory depender谩 completamente de la implementaci贸n de JPA que estemos utilizando en nuestra unidad de persistencia. Regresando un poco al archivo persistence.xml podremos ver que existe la siguiente l铆nea:

Esta l铆nea le dice al EntityManagerFactory con que proveedor estamos trabajando de tal manera que, si el d铆a de ma帽ana decidimos trabajar con un proveedor distinto a EclipseLink, tan solo tendremos que definir la clase de la nueva implementaci贸n de JPA.

Comprender exactamente c贸mo funciona la clase EntityManagerFactory requiere conocer c贸mo funciona el patr贸n de dise帽o Abstract Factory, el cual se explica perfectamente en mi libro.

 

Una vez explicado la forma de obtener en EntityManager procederemos, para lo cual solo ser谩 necesario ejecutar el proyecto, te preguntar谩 si quieres establecer la clase EntityManagerUtil como clase principal del proyecto, seleccionamos que s铆 y el programa iniciar谩 con la ejecuci贸n, si todo sale bien, entonces tendr谩s una salida como la siguiente:

Este punto es crucial para muchas personas, debido a que mucha gente no logra configurar el EntityManager y mueren en el intento, si por alguna raz贸n el programa no te funciona, recuerda que me puedes enviar un comentario al final de este art铆culo, a si te puedo ayudar a encontrar el problema.

Finalmente, observemos que en la salida existe una l铆nea que dice EntityManager class ==> org.eclipse.persistence.internal.jpa.EntityManagerImpl聽, esto representa la clase real del EntityManager que creo el EntityManagerFactory. Con esto podemos dar por concluida la configuraci贸n del EntityManager y de la Unidad de persistencia, en el siguiente topico hablaremos hacerca de la Entidades, que son y como crearlas.

 

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聽
 

 

6 thoughts to “EntityManager y el archivo persistence.xml”

  1. Oscar buenas tardes mi hermano.
    Si por alguna razon alguien no logra configurar la EntityManager, es posible que se por los siguiente, resulta que al crear el archivo de persistence.xml, la configuracion por default de la linea 6 es
    name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/JPATutorial?zeroDateTimeBehavior=convertToNull"

    por consiguiente es bueno acotar que al final de esta liena hay que agregar &serverTimezone=UTC para que este sea igual a ejemplo ac谩 expuesto, ya que por alguna raz贸n da error.

    1. Hola Arqu铆medes, Tienes raz贸n, al parecer en las 煤ltimas versiones de MySQL est谩 solicitando este par谩metro adicional. No recuerdo que, en versiones anteriores fuera requerido, pero que bueno que lo comentas, voy actualizar el tutorial para que haga menci贸n a esto.
      Gracias por el aporte, te mando un abrazo.

      NOTA: Ver谩s que junte tus dos comentarios en uno solo, as铆 quedar谩 m谩s claro para el resto

  2. Hola
    En el apartado
    New Persistence Library.- – >Provider and Database –> Persistece Library – – EclipseLink (JPA 2.1)
    hay alg煤n modo de cambiar EclipseLink por otra libreria que implementa JPA 2.2
    Lo he intentando desplegando el list box y eligiendo la option new Persistecen Library, pero no he logrado que la nueva librer铆a sea a帽adida al list box
    Saludos

    1. Hay dos formas si mal no recuerdo, la primera, te debe de de decir a un lado, instalar nueva librer铆a o algo as铆, la otra, es que ese listado se llena en funci贸n del servidor de aplicaciones que tienes, pues detecta la implementaci贸n de JPA que utiliza por default.

Deja un comentario

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