martes, 13 de agosto de 2013

Creación de entidades JPA Parte 1

La idea es que mediante un ejemplo en NetBeans se muestre como se pueden crear entidades JPA, para esto se deben seguir los siguientes pasos.

  • Lo primero que se debe hacer es crear un nuevo proyecto web que para el ejemplo tendrá el nombre PrimerJPA, para esto ir a Archivo > Proyecto Nuevo > Java Web > Web Applicarion. Y poner los datos tal como aparecen en la siguiente imagen.


  • En la siguiente página (Server and Settings) dejar todo como está por defecto para oprimir siguiente y pasar a la pantalla de Frameworks, en esta pantalla hay que elegir JavaServer Faces y sin cambiar nada hacer clic en terminar.


  • Con esto se crea un nuevo proyecto web, ahora se debe agregar una nueva entity. Para esto hay que ir a la siuiente ruta Archivo > Archivo Nuevo > Persistencia > Entity Class y oprimir siguiente.


  • En la siguiente pantalla ingresar el nombre de la Entity que para el ejemplo se llamará Alumno, también hay que indicar un nombre de paquete que puede ser com.tutorial.persistencia dejando la pantalla como muestra la siguiente imagen.


  • Es muy importante tener marcado el check que indica que se debe crear una unidad de persistencia ya que todos los proyectos JPA la requieren, esto se define en un archivo que se llama persistence.xml en donde se incluyen los datos necesarios para acceder al motor de BD que persistirá finalmente las entidades.
  • En la siguietne pantalla se debe ingresar el nombre de la unidad de persistencia que para el ejemplo será el que se indica pro defecto PrimerJPAPU, el proveedor de persistencia también será el que se indica pro defecto que es EclipseLink (Encargado de que los datos de las clases convertidas en entidad persistan)


  • En fuente de datos seleccionar New Data Source, con lo que se abrirá una interfaz en la que hay que ingresar el nombre del JNDI que para el ejemplo se llamará jdbc/primerojpa.

 

  • En conexión a base de datos seleccionar Nueva Conexión de Base de Datos, con lo que se abrirá una nueva interfaz en donde hay que seleccionar el driver Java DB (Network) y oprimir siguiente como se aprecia en la imagen.


  • En esta nueva interfaz hay que ingresar los datos de la conexión a la BD, como está instalada en la misma máquina de trabajo en Servidor hay que escribir localhost, en Puerto el por defecto que es 1527, en Base de Datos el nombre del la BD que para el ejemplo será primerojpa, como la BD aún no existe se agregará en el apartado URL de JDBC el comando ;create=true para indicarle a Java DB que cree una nueva BD. También hay que agregar el nombre de usuario y contraseña que para el ejemplo será app (app porque cada usuario usapor defecto el nombre de esquema del login por lo tanto se usará automáticamente el esquema app que ya existe por defecto en la BD). Finalmente hacer clic en Probar Conexión que indicará Connection Succeeded si todo sale bien, oprimir en siguiente.


  • En la siguiente ventana elegir el esquema a utilizar que para este caso sera el esquema APP y oprimir en terminar con lo que se habrá creado la conexión y fuente de datos.



  • En la siguiente ventana oprimir Aceptar.


  • Finalmente en la última ventana dejar marcado el check Utilice APIs de Java Transaction para que el API sea el que maneje las transacciones de la BD y en Estratergia de generación de tablas elegir la opción Eliminar y Crear (Drop and Create), esta opción se usa para que cada vezque se ejecuta la aplicación se eliminen y vuelvan a crear las tablas por si se generan cambios en las estructuras de las mismas, posupuesto se pierden los datos almacenados pero como es un ambiente de desarrollo esto no es relevante por ahora. Para finalizar oprimir terminar.


Como implementar una entidad

Para ejemplificar la implementación de una entidad se analizará un ejemplo con una clase de nombre libro, a la cual se le incluyen anotaciones del paquete javax.persistence Annotation Types.

  • Para ser reconocida como una entidad, la clase debe aparecer con la anotación @javax.persistence.Entity
  • La anotación @javax.persistence.Id permite determinar la clave primaria.
  • La anotación @javax.persistence.GeneratedValue permite generar valores automáticos para la primary key.
  •  La anotación @javax.persistence.Column permite personalizar la conversión de las columnas.

Con esto el proveedor de persistencia JPA realiza lo siguiente:
  • Asigna la Entity Libro a la tabla Libro.
  • Genera una clave primaria (id).
  • Sincroniza los valores de los atributos de la clase Libro en las columnas de la tabla Libro.

El resultado es el que se muestra a continuación

 

La ventaja de esto es que JPA permite consultar entidades y sus relaciones en un modo orientado a objetos sin tener que usar claves externas o las columnas de las bases de datos.
La interfaz que permite manejar las entidades es javax.persistence.EntityManager quien proporciona los métodos necesarios para acceder a la base de datos y llevar a cabo las distintas acciones. Además oculta la llamada JDBC a la BD y las declaraciones de tipo CRUD (Create, Read, Update and Delete), estas últimas se generan no mediante SQL sino mediante JPQL.

Un ejemplo de un JPQL es el que se muestra a continuación.


En la imagen anterior se muestra una consulta en amarillo que forma parte de uno de los parametros de la anotación @javax.persistence.NamedQuery la cual posteriormente debe ser ejecutada por el método EntityManager.createNamedQuery() quien finalmente es el que devuelve los datos que se buscan (esto no se meustra en el ejemplo).


lunes, 5 de agosto de 2013

Entity Bean

Un Entity Bean es una clase ( POJO ) que representa una tabla de una base de datos, y cada instancia de esta clase representa un registro de la tabla, es decir, con los entity beans lo que se consigue es crear un mapeo entre las propiedades de una clase y los campos de una tabla. Además de este mapeo también se puede especificar las relaciones que tienen las clases entre sí ( uno a uno, uno a muchos, muchos a uno y muchos a muchos ). Todo Entity Bean debe de tener una clave primaria que identifica a ese registro de forma única dentro de la tabla. Todas estas configuraciones se realizan a través de anotaciones, y el API que se encarga de gestionar todos los aspectos relativos a la persistencia es JPA ( Java Persistent API).
Las entidades al ser manejadas por el EntityManager tienen un estado persistente pero al desconectarse del EntityManager las entidades al ser POJOs pueden ser utilizadas como cualquier otra clase Java.
A continuación se muestra el ciclo de vida de una entity.


  • Cuando se crea una instancia de la entity Libro con el operador new lo que se crea es un objeto que "existe en memoria" y de momento JPA no sabe del objeto en cuestión por lo cual es un objeto como cualquier otro.
  • Cuando es manejado por el EntityManager su estado es mapeado (asignado) y sincronizado con la BD, para este ejemplo con una tabla de nombre Libro.
  • Si se llama al método EntityManager.remove() se borran los datos de la BD y el objeto continua "existiendo en la memoria" hasta que sea recolectado como basura
 Las operaciones que pueden llevar a cabo las entity son las siguientes.


Cada una de las operaciones a excepción de loading tienen un evento pre y post, con esto el EntityManager puede interceptar estos eventos he invocar algún método en particular de la aplicación. La declaración de cada uno de estos eventos es la siguiente.
  • @PrePersist
  • @PostPersist
  • @PostLoad
  • @PreUpdate
  • @PostUpdate
  • @PreRemove
  • @PostRemove
Estas anotaciones pueden ser configuradas como métodos entity (callback) y clases externas (listeners) muy parecidas en funcionamiento a los trigger de BD.


jueves, 1 de agosto de 2013

Tecnologías para persistir objetos en Java

La idea es poder hacer que los datos de un objeto sean persistentes teniendo en cuenta lo siguiente:

  • Los objetos encapsulan su estado y son visibles mientras la JVM se está ejecutando.
  • Si la JVM se detiene o el GarbageColector limpia su contenido en memoria los objetos desaparecen y con ellos su estado o contenido.
Para poder persistir los estados de sus objetos Java cuenta con diversos métodos:

  • Mediante serialización: Convertir un objeto en una secuencia de bits mediante la implementación de la interfaz java.io.serializable. Sin embargo no es un lenguaje de consulta ni soporta un alto acceso concurrente.

  •  Mediante Java Database Connectivity JDBC: API estándar para acceder a bases de datos relacionales con todo lo que ello involucra. Sin embargo se están viendo reemplazadas por otras herramientas como las ORM.


  •  Mapeo Objeto Relacional ORM: Técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional, utilizando un motor de persistencia.



 Para esto se utilizan Frameworks como; Hibernate, JDO y JPA




Es un framework del lenguaje de programación Java que maneja datos relacionales en aplicaciones usando la Plataforma Java que le permite ser independiente de SQL,m se basa en el paquete javax.persistence.

Los principales componentes de esta API son:
  • Object-Relational Mapping ORM: Es el mecanismo de mapeo (asignación) de objetos a los datos almacenados en BD relacionales.
  • EntityManager: API encargada de ejecutar operaciones CRUD (Create, Read, Update y Delete) en la BD relacional.
  • Java Persistence Query Language JPQL: Es el lenguaje persistente de consulta Java que permite recuperar datos con un lenguaje orientado a objetos.
  • Java Transaction API JTA: Transacciones y mecanismos de bloqueo cuando se accede a datos de modo concurrente.

 
 Son objetos que viven muy poco tiempo en la memoria y de manera persistente en la BD. Estas pueden ser mapeadas a una BD, pueden ser concretas o abstractas, soportan herencia, relaciones y una vez asignadas se pueden manejar mediante JPA.
Se pueden insertar, eliminar y consultar mediante JPQL gracias a la manipulación que permite ORM mientras se accede a la BD.

 A continuación se muestra un resumen de todo lo visto