API Java de persistencia

Aplicaciones web y Bases de datos
• Normalmente las aplicaciones web guardan datos de distintos tipos, tanto datos producidos durante la interacción de los usuarios con la aplicación como datos que son mostrados a los usuarios. • Java incluye mecanismos para permitir que los programas accedan a bases de datos. • Java EE también incluye mecanismos específicos para hacer más eficiente el acceso a bases de datos.

Servidor de bases de datos
• MySQL Server 5.5 Usuario: root, Clave: mysql • Arranque: automático (servicio MySQL) • Parada:
C:\Archivos de programa\MySQL\MySQL Server 5.5\bin\

mysqladmin -uroot -pmysql shutdown • Administración:
C:\Archivos de programa\MySQL\MySQL Server 5.5\bin\

mysqladmin -uroot -pmysql

5\bin\ mysql -uroot -pmysql – Finalización: quit. – USE CLS. – SHOW DATABASES. • Bases de datos: – CREATE DATABASE CLS.Servidor de bases de datos. . • Tablas: – SHOW TABLES. II • Acceso desde cliente: C:\Archivos de programa\MySQL\MySQL Server 5.

COLUMN_NAME. …) . TABLE_NAME. III • Catálogo: information_schema (base de datos) – TABLES(TABLE_SCHEMA.Servidor de bases de datos. …) – COLUMNS(TABLE_SCHEMA. TABLE_NAME.

• JDBC se utiliza mediante un driver que al cargarse permite que un programa Java se conecte a un servidor de bases de datos como un usuario determinado • JDBC proporciona clases para representar las conexiones.JDBC • JDBC es una biblioteca de Java que permite la conexión a bases de datos relacionales. consultas SQL y resultados de las mismas. .

II • Un programa Java que utiliza JDBC hace lo siguiente: – Carga el driver JDBC (la clase que gestiona el acceso a bases de datos).JDBC. obteniendo un conjunto de resultados (o void). – Itera si es necesario sobre los resultados. – Crea una consulta en base a código SQL. – Ejecuta la consulta. . – Cierra la conexión. – Crea una conexión a la base de datos.

Utilización de JDBC mediante la API de persistencia • La API de persistencia. . • Cuando una aplicación Java utiliza la API de persistencia (JPA). permite la especificación de manera sencilla de aplicaciones con un número elevado de usuarios simultáneos que acceden de manera eficiente a bases de datos. se crea un pool de conexiones JDBC que se reutilizan por los distintos hilos de la aplicación. que es parte de JEE pero se puede utilizar en otras aplicaciones Java.

JPA: Consultas • El Lenguaje de Consultas de Persistencia de Java (JPQL) permite especificar consultas a bases de datos relacionales en forma parecida a SQL desde un programa Java. .

II • Los objetos que implementan la interfaz TypedQuery<?> de JPA representan consultas del tipo anterior. .JPA: Consultas. • Los objetos de la clase anterior que representan consultas que devuelven valores (tipo SELECT) al ejecutar la consultas devuelven listas de objetos.

„inglesa‟) • SELECT * FROM PERSONA • UPDATE PERSONA SET NACIONALIDAD=„española‟ • DELETE FROM PERSONA .Recordatorio: Consultas en SQL • INSERT INTO PERSONA VALUES („Pepe‟. „Pérez‟.

nombre = „Pepe‟ .Consultas en JPQL • SELECT p FROM Persona p – Persona es una entidad (clase) – p representa una variable Java de la clase – El resultado de la ejecución de la consulta es una lista de objetos de la clase • Se pueden añadir otras cláusulas: – SELECT p FROM Persona p WHERE p.

Consultas en JPQL. II • Cuestiones pendientes de estudiar: – Programación de consultas – Acceso a resultados devueltos por las consultas – Definición de entidades – Sincronización .

• A continuación veremos cómo se utilizan y cómo se crean los EntityManagers. que se ocupa de la gestión de los datos y de objetos que los representan. • Tras esto veremos cómo se definen las clases de objetos que representan registros de una base de datos.JPA: EntityManager • Para crear y ejecutar consultas mediante JPA es necesario crear antes un objeto que implementa la interfaz EntityManager. .

JPA: Programación de consultas • Para crear una consulta se utiliza el método createQuery de la clase EntityManager. .class). cuyo argumento es la cadena de caracteres que define la consulta JPQL: TypedQuery<Persona> query = em. Persona.createQuery( “SELECT p FROM Persona p”.

getResultList().List<Persona> pers = query.JPA: Acceso a resultados • Para ejecutar una consulta de tipo SELECT se utiliza el método getResultList. . que devuelve una lista de objetos: java.util.

• La inyección directa de EntityManager solamente se puede hacer en un contexto monohilo (EJB sin estado. puede inyectar una EntityManagerFactory que sea un atributo suyo o directamente un EntityManager. página JSP. • La inyección de EntityManagerFactory se puede hacer en cualquier contexto (servlet. bean gestionado de JSF o EJB). ServletContextListener. beans gestionados de JSF.Gestión de persistencia en Java EE • En Java EE. . …). cuando un contenedor activa un objeto.

Gestión de persistencia en Java EE: Ejemplos • Ejemplo de inyección de E. • Ejemplo de inyección de EntityManager: @PersistenceContext EntityManager em.Factory: @PersistenceUnit private EntityManagerFactory emf. .createEntityManager().M. EntityManager em = emf.

Recursos en Java EE • Los servidores de aplicaciones web permiten el acceso a recursos externos como sistemas de gestión de bases de datos o de colas de mensajes. asociándoles un nombre accesible a través del protocolo Java JNDI. El uso de JNDI es transparente. • El servidor registra los recursos. . • La gestión de recursos se puede hacer desde NetBeans o desde la aplicación de administración del servidor de aplicaciones.

Consideraciones para la utilización de la API de persistencia en el lab • Para acceder a una base de datos mediante JPA hay que utilizar dos recursos: un recurso JDBC y un pool de conexiones JDBC. .

. contraseña. usuario. II • Un pool de conexiones JDBC es un conjunto de conexiones JDBC a una base de datos disponibles para ser reutilizadas concurrentemente por distintos hilos de la aplicación. • Para especificar un pool de conexiones se indica la base de datos. propiedades.Consideraciones para la utilización de la API de persistencia en el lab. etc.

• Para especificar un recurso JDBC hay que indicar el nombre con que está registrado el pool correspondientes y las propiedades.Consideraciones para la utilización de la API de persistencia en el lab. III • Un recurso JDBC es un proxy a un pool de conexiones. .

III • Para crear un recurso JDBC y un connection pool en el servidor de aplicaciones hay dos posibilidades: – Localhost:4848 -> Resources -> JDBC – NetBeans -> Proyecto -> New persistence unit -> new Data Source -> new Data Base connection .Consideraciones para la utilización de la API de persistencia en el lab.

. • La cláusula persistence-unit permite especificar un data-source. • El fichero de configuración debe incluirse en el directorio /META-INF del módulo correspondiente.xml permite especificar las bases de datos accesibles a una aplicación y las entidades que utiliza.Acceso a recursos JDBC desde aplicaciones web • El fichero de configuración persistence.

sun.widgets.xml <?xml version="1.widgets.Ejemplo de fichero persistence.Cust</class> </persistence-unit> </persistence> .com/xml/ns/persistence" xmlns:xsi="http://www..w3...Order</class> <class>com."> <persistence-unit name="book" transaction-type="JTA"> <jta-data-source>jdbc/__default</jta-data-source> <class>com.org/.“ xsi:schemaLocation="http://.0" encoding="UTF-8" ?> <persistence version="1..0" xmlns="http://java.

Clases entidad • Son clases asociadas a tablas (una o varias) en una base de datos. • Se declaran mediante la anotación @Entity. • La clave primaria se indica mediante la anotación @Id (obligatorio). • Sus objetos se asocian a registros. … } . • @Entity public class Person { @Id int id.

II • Si la tabla primaria tiene un nombre diferente de la clase. éste se especifica mediante la anotación @Table(name). • NetBeans permite la opción de crear la tabla (si no existe) al compilar el código de la clase .Clases entidad.

Clases entidad. III • Tipos de atributos: – Persistentes (ver próxima transparencia) – No persistentes (@Transient) – Embebidos (@Embedded). de otra entidad. incluidos en la tabla de la primera – Generados automáticamente (@GeneratedValue) – Relaciones (próxima transparencia) .

temporales (Date. arrays de bytes y chars. wrappers. Map . String. enumeraciones. …). Set. List.Clases entidad: Atributos persistentes • Son todos salvo los no persistentes • Tienen que ser protegidos o privados • Tipos: Primitivos. clases embedibles • Colecciones: Collection.

widgets.xml (alternativa) <persistence> <persistence-unit name=“…“> <jta-data-source>…</jta-data-source> … <class>com.Definición de entidades en persistence.Order</class> <class>com.widgets.Cust</class> </persistence-unit> </persistence> .

Se definen en el servidor. Se definen mediante la anotación @Entity. . • Los recursos JDBC y los pools de conexiones se utilizan por el servidor web para implementar la conexión a la base de datos.JPA básico: Resumen • Las clases de entidades representan registros de tablas.

Se inyectan en un objeto gestionado por un contenedor o se crean a partir de una fábrica inyectada. II • Los recursos utilizados por una aplicación se especifican en el fichero persistence. • Los EntityManagers gestionan el acceso a las bases de datos. Están asociados a un recurso JDBC.JPA básico: Resumen. .xml.

. Se crean a partir de ellas y en su caso devuelven listas de entidades.JPA básico: Resumen. III • Los TypedQuerys pueden ejecutar consultas JPA.

Ejercicio
• [DBPERS0] Desarrollar una aplicación web que permita ver la lista de personas incluidas en una base de datos de personas sencilla, como la mencionada en los ejemplos anteriores.

JPA: Programación de consultas, II
• Se pueden definir TypedQuerys con tipo atómico (Integer, String, etc.) para consultas que seleccionan una sola columna: TypedQuery<String> query = em.createQuery( “SELECT p.nombre FROM Persona p”, String.class);

JPA: Programación de consultas, III
• Las consultas de actualización o borrado se definen de forma similar: UPDATE Persona p SET p.nacionalidad=„española‟

DELETE FROM Persona p WHERE p.estado=„fallecido‟

executeUpdate().JPA: Programación de consultas. . IV • Para ejecutar una consulta de tipo UPDATE o DELETE se utiliza el método executeUpdate(): query.

createQuery( “SELECT p FROM Persona p WHERE p.edad=?1). V • Se pueden definir consultas parametrizadas utilizando patrones de parámetros: TypedQuery<Persona> query= em.getResultList(). 3). . pers = query.setParameter(1.JPA: Programación de consultas.

Ejercicio • [DBPERS1] Desarrollar una aplicación web que permita gestionar a través de Internet una base de datos de personas sencilla. permitiendo dar de alta y de baja a personas y modificar sus datos. . como la mencionada en los ejemplos anteriores.

SWCC. PyCE2. AJAXPERS) para guardar sus datos sustituyendo los ficheros por una base de datos.Ejercicios voluntarios • [DBFILE…] Completar los ejercicios de los temas anteriores que utilizan ficheros (PyCE1. SWJSF. FAV. .

superinterfaz de TypedQuery<?>.JPA: Programación de consultas.createNativeQuery implementa la interfaz Query. VI • Se pueden utilizar consultas SQL (consultas nativas) mediante el método createNativeQuery de la clase EntityManager. • El objeto creado por EntityManager. .

VII • Los registros obtenidos mediante el método Query.println(persona[0] + " " + persona[1]).JPA: Programación de consultas.getResultList a partir de una consulta SQL son arrays de objetos. out.getResultList().createNativeQuery( "SELECT * FROM PERSONA”) .get(0). • Ejemplo: Object[] persona = (Object[]) em. .

JPA: Programación de consultas. VIII • Se puede determinar el número del registro a partir del cual se extraen los resultados y el número máximo de resultados a extraer en una consulta: em.createQuery( “SELECT p FROM Persona p”) .setMaxResults(9). .setFirstResult(5).

class. 2130). Object) de la clase EntityManager. • Utiliza su segundo argumento como clave primaria.Búsqueda de objetos individuales • Se hace mediante el método find(Class<?>. . • Ejemplo: Person p = e.find(Person.

• Por ejemplo. una entidad persistente creada a través de una consulta a la base de datos normalmente está gestionada por el EntityManager que hace la consulta.Entidades persistentes: Ciclo de vida • Las entidades persistentes pueden estar desacopladas de la base de datos o acopladas a ella a través de un EntityManager. En este caso están en el estado Managed (gestionadas). .

Entidades persistentes: Ciclo de vida. II SELECT Managed (em) Detached .

Entidades persistentes: Ciclo de vida. • Si una entidad está en el estado New. . en la base de datos puede haber un registro cuya clave primaria sea la misma de la entidad. III • Una entidad persistente creada mediante new está desacoplada de la base de datos y se encuentra inicialmente en el estado New.

IV New new SELECT Managed (em) Detached .Entidades persistentes: Ciclo de vida.

V • Las entidades persistentes que están en el estado New pueden acoplarse a la base de datos mediante el método persist(Object) de la clase EntityManager. se lanza una excepción. . • Si en la base de datos ya hay un registro con la misma clave primaria. que las gestiona a partir de ese momento tras insertar los registros necesarios en la base de datos.Entidades persistentes: Ciclo de vida.

Entidades persistentes: Ciclo de vida.persist(o) SELECT Managed (em) New new Detached . VI [Añade registro] em.

VII • Las entidades persistentes gestionadas se pueden desacoplar de la base de datos mediante el método close(Object) del EntityManager que las gestiona.Entidades persistentes: Ciclo de vida. • El método merge(Object) de la clase EntityManager permite volver a gestionar una entidad persistente que está en el estado Detached. Tras su ejecución se actualizará la base de datos con su contenido. . pasando a estar en el estado Detached.

merge(o) [objBD] Detached em.close(o) .Entidades persistentes: Ciclo de vida. VIII [Añade registro] em.persist(o) SELECT Managed (em) New new em.

. IX • Tanto en el estado New como en Detached los cambios que origina el cambio de estado de una entidad persistente no se trasladan necesariamente a la base de datos de inmediato (se hace cuando termina la transacción que se está ejecutando).Entidades persistentes: Ciclo de vida. • Lo mismo ocurre con los cambios en los valores de los atributos persistentes de las entidades gestionadas.

• Esto permite que cualquier otra consulta que se haga refleje los cambios realizados en las entidades gestionadas por el EM. X • Se puede forzar la realización inmediata en la base de datos de los cambios pendientes de realizar correspondientes a todas las entidades gestionadas por un EntityManager mediante el método flush() del mismo.Entidades persistentes: Ciclo de vida. .

flush() Managed (em) New new em.merge(o) [objBD] Detached em. XI [Añade registro] em.Entidades persistentes: Ciclo de vida.close(o) .persist(o) SELECT [objsBD] em.

XII • Las consultas tienen asociado un modo de flush. • Los EntityManagers también tienen un modo de flush. .Entidades persistentes: Ciclo de vida. • El modo de flush puede ser AUTO o COMMIT. que permite hacer que siempre que se ejecuten haya garantías de que la base de datos está actualizada con respecto a cambios en las entidades gestionadas.

cuando se termina una transacción). . XIII • La actualización de los registros correspondientes a las entidades gestionadas por un EntityManager se puede hacer mediante una llamada explícita al método flush() en el programa o lo puede hacer el EntityManager al ejecutar acciones previstas en su funcionamiento (por ejemplo.Entidades persistentes: Ciclo de vida.

mediante el método remove de la clase EntityManager.Entidades persistentes: Ciclo de vida. XIV • También se puede actualizar una entidad acoplada a una base de datos con los valores que ésta contiene. . Esto se hace mediante el método EntityManager.refresh(Object). La entidad pasa entonces al estado Removed. • Se puede borrar de una base de datos la información correspondiente a una entidad acoplada a ella.

flush() Managed (em) em. XV [Añade registro] em.close(o) .refresh(o) [objsBD] em.Entidades persistentes: Ciclo de vida.remove(o) [Elimina registro] Removed New new em.persist(o) SELECT [BD obj] em.merge(o) [objBD] Detached em.

lock(Object. WRITE • em.Gestión de entidades: Otros aspectos • em. sin sincronizarlas • em.clear().close().setFlushMode(FlushModeType) // AUTO (tras ejecución de update) // COMMIT (tras finalizar transacción) • em. LockModeType) // READ. // Cierra conexiones . // Desconecta entidades.

Relaciones muchos a uno Ejemplo • Tablas: – Persona(id int primary key.id) – Empresa(id int primary key. nombre varchar) • Entidades: – Persona(@Id int id. @ManyToOne Empresa trabajo) // Propietario – Empresa(@Id int id. nombre varchar. trabajo int ref Empresa. String nombre. String nombre) .

nombre varchar) – Clientes(idE int ref Empresa.id) – Empresa(id int primary key. idP int ref Persona. idP)) .id primary key (idE.id. nombre varchar. trabajo int ref Empresa.Relaciones muchos a muchos Ejemplo • Tablas: – Persona(id int primary key.

. @ManyToOne Empresa trabajo) – Empresa(@Id int id. La elección se debe basar en criterios de eficiencia. @ManyToMany Set<Persona> clientes) // Prop • Se podría haber hecho propietaria a la entidad Persona. String nombre.Relaciones muchos a muchos Ejemplo. String nombre. II • Entidades: – Persona(@Id int id.

Relación uno a muchos • Relación inversa de otra muchos a uno • Se implementa por motivos de eficiencia (si se va a utilizar con frecuencia) • Ejemplo: Empresa(@Id int id. String nombre. @ManyToMany Set<Persona> clientes. @OneToMany(mappedBy=“trabajo”) Set<Persona> trabajadores) .

@ManyToMany(mappedBy=“clientes”) Set<Empresa> contratistas) . @ManyToOne Empresa trabajo.Relaciones muchos a muchos: Relación inversa • Se implementa por motivos de eficiencia (si se va a utilizar con frecuencia) • Ejemplo: Persona(@Id int id. String nombre.

@OneToOne Persona director) • En la base de datos una relación uno a uno no se distingue de una muchos a uno.Relaciones uno a uno • Ejemplo: Empresa(…. salvo quizás por una restricción de integridad • Las relaciones uno a uno se especifican mediante la anotación @OneToOne • La relación inversa de una relación uno a uno es también una relación uno a uno .

name=„Renfe‟ (lista de Person) • Para poder hacer una consulta que atraviesa una relación. la relación tiene que estar definida (en la clase de entidades persistentes) en la dirección en la que es atravesada. .Consultas y relaciones • Ejemplos: Empleados de Renfe select p from Empresa e JOIN e.clientes p where e.

Entidades: Jerarquía de herencia • La API de persistencia incluye varios mecanismos para aprovechar la herencia que proporciona Java .

Relaciones y gestión de entidades • La API de persistencia permite especificar que las acciones de inserción y/o borrado de objetos deben propagarse a través de determinadas relaciones. si se quieren eliminar los objetos relacionados con uno cuando se elimine. se utiliza el atributo cascade=REMOVE de la relación . REMOVE o ALL. cuyos valores pueden ser PERSIST. • Para ello se utiliza el atributo cascade de la anotación de la relación. • Por ejemplo.

@ManyToMany Set<Persona> clientes.Relaciones y gestión de entidades. @OneToMany(mappedBy=“trabajo” cascade=REMOVE) Set<Persona> trabajadores) . II • Ejemplo. continuación: Empresa(@Id int id. String nombre.

Transacciones en SQL • Una transacción es una secuencia de instrucciones SQL que se ejecutan provisionalmente. • Por ejemplo. un movimiento en una cuenta corriente puede realizarse mediante una transacción que comprueba que el usuario ha actuado correctamente en el cajero automático. pudiendo anularse en cualquier momento o consolidarse al final. .

II • En una sesión de ejecución de instrucciones en un Sistema de Gestión de Bases de Datos cualquier instrucción normal comienza una transacción si no hay una comenzada. . • La instrucción COMMIT termina una transacción dando por buenos los cambios. • La instrucción ROLLBACK termina una transacción deshaciendo los cambios.Transacciones en SQL.

de manera que si se produce un error tanto en el servidor de bases de datos como en la máquina virtual se realizan acciones de recuperación a un estado seguro. • Las transacciones son un tema optativo en CLS y se estudiarán junto con las Enterprise Java Beans (EJB). .Transacciones en Java EE • Java EE permite definir transacciones que abarcan la ejecución de métodos.

Ciclo de vida completo de entidades .

Sign up to vote on this title
UsefulNot useful