SlideShare una empresa de Scribd logo
1 de 56
Descargar para leer sin conexión
Let's Rock Java


Fundamentos de Java Enterprise Edition
con JDeveloper

Eudris Cabrera Rodriguez

Ingeniero Telemático
Senior Software Developer
Skype:eudriscabrera
LinkedIn:http://www.linkedin.com/in/eudriscabrera

Diciembre 2011, Santiago de los Caballeros, R. D.
Objetivos


Aprender los conceptos fundamentales sobre los manejadores de
persistencia en Java y su implementación en una aplicación
empresarial Java (JEE).
Agenda
  ○ Manejadores de persistencia
    ■ Conceptos y Definiciones
    ■ Introdución a Java Persistence API (JPA)
    ■ Conceptos Avanzados de Java Persistence API
       (JPA)
  ○ Persistencia en la capa web
  ○ JSTL (JavaServer pages Standard Tag Library)
Conceptos y definiciones

   En Java solucionamos problemas de negocio a través de
   objetos, los cuales tienen estado y comportamiento.

   Sin embargo, las bases de datos relacionales almacenan
   la información mediante tablas, filas, y columnas, de
   manera que para almacenar un objeto hay que realizar
   una correlación entre el sistema orientado a objetos de
   Java y el sistema relacional de nuestra base de datos.

   JPA (Java Persistence API - API de Persistencia en
   Java) es una abstracción sobre JDBC que nos permite
   realizar dicha correlación de forma sencilla, realizando por
   nosotros toda la conversión entre nuestros objetos y las
   tablas de una base de datos.
Conceptos y definiciones

Esta conversión se llama ORM (Object Relational Mapping -
Mapeo Relacional de Objetos), y puede configurarse a
través de metadatos (mediante xml o anotaciones).

Por supuesto, JPA también nos permite seguir el sentido
inverso, creando objetos a partir de las tablas de una base de
datos, y también de forma transparente. A estos objetos los
llamaremos desde ahora entidades (entities).

JPA establece una interface común que es implementada por
un proveedor de persistencia de nuestra elección (como
Hibernate, Eclipse Link, etc), de manera que podemos elegir
en cualquier momento el proveedor que más se adecue a
nuestras necesidades. Así, es el proveedor quién realiza el
trabajo, pero siempre funcionando bajo la API de JPA.
Introdución a Java Persistence API (JPA)
UNA ENTIDAD SIMPLE:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Pelicula {
   @Id
   @GeneratedValue
   private Long id;
   private String titulo;
   private int duracion;

   // Getters y Setters
Introdución a Java Persistence API (JPA)

Las entidades suelen ser POJOs. La clase Pelicula se ha
anotado con @Entity, lo cual informa al proveedor de
persistencia que cada instancia de esta clase es una entidad.
Para ser válida, toda entidad debe:

- Tener un constructor por defecto
- Ser una clase de primer nivel (no interna)
- No ser final
- Implementar la interface java.io.Serializabe si es accedida
remotamente

La configuración de mapeo puede ser especificada mediante
un archivo de configuración XML, o mediante anotaciones. A
esta configuración del mapeo la llamamos metadatos.
Introdución a Java Persistence API (JPA)

IDENTIDAD:
Todas las entidades tienen que poseer una identidad que las
diferencie del resto, por lo que deben contener una propiedad
marcada con la anotación @Id (es aconsejable que dicha
propiedad sea de un tipo que admita valores null, como
Integer en lugar de int).


CONFIGURACIÓN POR DEFECTO :
JPA aplica a las entidades que maneja una configuración por
defecto, de manera que una entidad es funcional con una
mínima cantidad de información (las anotaciones @Entity y
@Id en nuestro caso).
Introdución a Java Persistence API (JPA)

Con esta configuración por defecto, todas las entidades del
tipo Pelicula serán mapeadas a una tabla de la base de datos
llamada PELICULA, y cada una de sus propiedades será
mapeada a una columna con el mismo nombre (la propiedad
id será mapeada en la columna ID, la propiedad título será
mapeada en la columna TITULO, etc).

Sin embargo, no siempre es posible ceñirse a los valores de
la configuración por defecto: imaginemos que tenemos que
trabajar con una base de datos heredada, con nombres de
tablas y filas ya definidos.
Introdución a Java Persistence API (JPA)

   En ese caso, podemos configurar el mapeo de manera
   que se ajuste a dichas tablas y filas:

   @Entity
   @Table(name = "TABLA_PELICULAS")
   public class Pelicula {
     @Id
     @GeneratedValue
     @Column(name = "ID_PELICULA")
     private Long id;
     ...
   }
Introdución a Java Persistence API (JPA)

La anotación @Table nos permite configurar el nombre de la
tabla donde queremos almacenar la entidad mediante el
atributo name.

Así mismo, mediante la anotación @Column podemos
configurar el nombre de la columna donde se almacenará una
propiedad, si dicha propiedad puede contener un valor null,
etc.
LET'S CODE !!!
Introdución a Java Persistence API (JPA)

LECTURA TEMPRANA Y LECTURA DEMORADA

JPA nos permite leer una propiedad desde la base de datos la
primera vez que un cliente intenta leer su valor (lectura demorada).
Esto puede ser útil si la propiedad contiene un objeto de gran
tamaño:
@Basic(fetch = FetchType.LAZY)
private Imagen portada;

El comportamiento por defecto de la mayoría de tipos Java es el
contrario (lectura temprana). Este comportamiento, a pesar de ser
implícito, puede ser declarado explícitamente de la siguiente
manera:
@Basic(fetch = FetchType.EAGER)
private Imagen portada;
Introdución a Java Persistence API (JPA)

ASOCIACIONES
Cuando queremos mapear colecciones de entidades,
debemos usar asociaciones. Estas asociaciones pueden ser
de dos tipos:

   - Asociaciones unidireccionales
   - Asociaciones bidireccionales

Las asociaciones unidireccionales reflejan un objeto que tiene
una referencia a otro objeto (la información puede viajar en
una dirección).

Por el contrario, las asociaciones bidireccionales reflejan dos
objetos que mantienen referencias al objeto contrario (la
información puede viajar en dos direcciones).
Introdución a Java Persistence API (JPA)
Además del concepto de dirección, existe otro concepto
llamado cardinalidad, que determina cuántos objetos pueden
haber en cada extremo de la asociación.
Introdución a Java Persistence API (JPA)
ASOCIACIONES UNIDIRECCIONALES


@Entity                     @Entity
public class Cliente {      public class Direccion {
    @Id                        @Id
    @GeneratedValue            GeneratedValue
    private Long id;           private Long id;
    @OneToOne                  private String calle;
    private Direccion          private String ciudad;
direccion;                     private String pais;
                               private Integer
    // Getters y setters    codigoPostal;
}
                                // Getters y setters
                            }
Introdución a Java Persistence API (JPA)
Otro tipo de asociación muy común es la de tipo uno-a-
muchos (one-to-many) unidireccional.

@Entity
public class Cliente {
   @Id
   @GeneratedValue
   private Long id;
   @OneToMany
   private List direcciones;

    // Getters y setters
}
Introdución a Java Persistence API (JPA)
ASOCIACIONES BIDIRECCIONALES

En las asociaciones bidireccionales, ambos extremos de la
relación mantienen una referencia al extremo contrario.

En este caso, el dueño de la relación debe ser especificado
explícitamente, de manera que JPA pueda realizar el mapeo
correctamente.
Introdución a Java Persistence API (JPA)
Ejemplo de bidireccionalidad en una relación de tipo
uno-a-uno

@Entity
                            @Entity
public class Mujer {
                            public class Marido {
   @Id
                               @Id
   @GeneratedValue
                               @GeneratedValue
   private Long id;
                               private Long id;
   @OneToOne
                               @OneToOne
   private Marido marido;
                            (mappedBy = "marido")
                               private Mujer mujer;
    // Getters y setters
                            }
}
Introdución a Java Persistence API (JPA)

PERSISTENCIA :
El concepto de persistencia implica el hecho de almacenar
nuestras entidades (objetos Java de tipo POJO) en un
sistema de almacenamiento, normalmente una base de datos
relacional (tablas, filas, y columnas).

Más allá del proceso de almacenar entidades en una base de
datos, todo sistema de persistencia debe permitir recuperar,
actualizar y eliminar dichas entidades. Estas cuatro
operaciones se conocen como operaciones CRUD (Create,
Read, Update, Delete - Crear, Leer, Actualizar, Borrar). JPA
maneja todas las operaciones CRUD a través de la interface
EntityManager.
Introdución a Java Persistence API (JPA)
PERSISTIR UNA ENTIDAD :
public class Main {

    public static void main(String[] args) {
    EntityManagerFactory emf =
    Persistence.createEntityManagerFactory("introduccionJPA");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();

    Pelicula pelicula = new Pelicula();
    pelicula.setTitulo("Pelicula uno");
    pelicula.setDuracion(142);

    tx.begin();
    try {
    em.persist(pelicula);
    tx.commit();
    } catch(Exception e) {
    tx.rollback()
    }
    em.close();
    emf.close();
    }
}
Introdución a Java Persistence API (JPA)
LEER UNA ENTIDAD
Leer una entidad previamente persistida en la base de datos
para construir un objeto Java. Podemos llevar a cabo de dos
maneras distintas:

   - Obteniendo un objeto real
   - Obteniendo una referencia a los datos persistidos


De la primera manera, los datos son leídos (por ejemplo, con
el método find()) desde la base de datos y almacenados en
una instancia de la entidad:


Pelicula p = em.find(Pelicula.class, id);
Introdución a Java Persistence API (JPA)

La segunda manera de leer una entidad nos permite obtener
una referencia a los datos almacenados en la base de datos,
de manera que el estado de la entidad será leído de forma
demorada (en el primer acceso a cada propiedad), no en el
momento de la creación de la entidad:


Pelicula p = em.getReference(Pelicula.class, id);
Introdución a Java Persistence API (JPA)

ACTUALIZAR UNA ENTIDAD

Mediante el método merge() de EntityManager podemos
tener nuestra entidad gestionada y sincronizada

tx.begin();
em.persist(pelicula);
tx.commit();
em.detach(pelicula);
// otras operaciones
em.merge(pelicula);
Introdución a Java Persistence API (JPA)
ELIMINAR UNA ENTIDAD

em.remove(pelicula);

Cuando existe una asociación uno-a-uno y uno-a-muchos
entre dos entidades, y eliminas la entidad dueña de la
relación, la/s entidad/es del otro lado de la relación no son
eliminada/s de la base de datos (este es el comportamiento
por defecto), pudiendo dejar así entidades persistidas sin
ninguna entidad que haga referencia a ellas.

Estas entidades se conocen como entidades huérfanas. Sin
embargo, podemos configurar nuestras asociaciones para
que eliminen de manera automática todas las entidades
subordinadas de la relación
Introdución a Java Persistence API (JPA)

OPERACIONES EN CASCADA

Este tipo de operaciones permiten establecer la forma en que
deben propagarse ciertos eventos (como persistir, eliminar,
actualizar, etc) entre entidades que forman parte de una
asociación.

 La forma general de establecer cómo se realizarán estas
operaciones en cascada se define mediante el atributo
cascade de las anotaciones de asociación:


@OneToOne(cascade = CascadeType.REMOVE)
private Descuento descuento;
Introdución a Java Persistence API (JPA)

CascadeType.PERSIST
  .REMOVE
  .MERGE
  .REFRESH
  .DETACH
  .ALL

La última constante, CascadeType.ALL, hace referencia a
todas las posibles operaciones que pueden ser propagadas, y
por tanto engloba en si misma el comportamiento del resto de
constantes.

También podemos configurar varias operaciones en cascada
de la lista superior usando un array de constantes
CascadeType:
Introdución a Java Persistence API (JPA)

@OneToOne(cascade = {
    CascadeType.MERGE,
    CascadeType.REMOVE,
    })
private Descuento descuento;
LET'S CODE !!!
Conceptos Avanzados de Java Persistence API (JPA)

JPQL (Java Persistence Query Language - Lenguaje de Consulta de
Persistencia en Java), un potente lenguaje de consulta orientado a
objetos que va incluido con JPA.

JPQL BÁSICO

JPQL nos permite realizar consultas en base a multitud de criterios
(como por ejemplo el valor de una propiedad, o condiciones
booleanas), y obtener más de un objeto por consulta.

SELECT p FROM Pelicula p
Conceptos Avanzados de Java Persistence API (JPA)

SENTENCIAS CONDICIONALES

El primero de ellos es el de consulta condicional, el cual es aplicado
añadiendo la cláusula WHERE en nuestra sentencia JPQL.

SELECT p FROM Pelicula p WHERE p.duracion < 120
Conceptos Avanzados de Java Persistence API (JPA)

PARÁMETROS DINÁMICOS
Podemos añadir parámetros dinámicamente a nuestras sentencias
JPQL de dos formas: por posición y por nombre. La sentencia
siguiente acepta un parámetro por posición (?1):

SELECT p FROM Pelicula p WHERE p.titulo = ?1

Y la siguiente, acepta un parámetro por nombre (:titulo):

SELECT p FROM Pelicula p WHERE p.titulo = :titulo
Conceptos Avanzados de Java Persistence API (JPA)

EJECUCIÓN DE SENTENCIAS JPQL

El lenguaje JPQL es integrado a través de implementaciones de la
interface Query.

Dichas implementaciones se obtienen a través de nuestro querido
amigo EntityManager, mediante diversos métodos de factoría. De
estos, los tres más usados (y los únicos que explicaremos aquí) son:

createQuery(String jpql)
createNamedQuery(String name)
createNativeQuery(String sql)
Conceptos Avanzados de Java Persistence API (JPA)

CONSULTAS CON NOMBRE (ESTÁTICAS)

Las consultas con nombre son diferentes de las sentencias dinámicas que
hemos visto hasta ahora en el sentido de que una vez definidas, no pueden
ser modificadas: son leídas y transformadas en sentencias SQL cuando el
programa arranca por primera vez, en lugar de cada vez que son
ejecutadas.

Este comportamiento estático las hace más eficientes, y por tanto ofrecen
un mejor rendimiento. Las consultas con nombre son definidas mediante
metadatos (recuerda que los metadatos se definen mediante anotaciones o
configuración XML), como puedes ver en este ejemplo:

@Entity
@NamedQuery(name="buscarTodos", query="SELECT p FROM Pelicula
p")
Conceptos Avanzados de Java Persistence API (JPA)

CONSULTAS NATIVAS SQL
El tercer y último tipo de consultas que nos queda por ver requiere
una sentencia SQL nativa en lugar de una sentencia JPQL:

String sql = "SELECT * FROM PELICULA";
Query query = em.createNativeQuery(sql);
Conceptos Avanzados de Java Persistence API (JPA)

Las consultas SQL nativas pueden ser definidas de manera estática
como hicimos con las consultas con nombre, obteniendo los mismos
beneficios de eficiencia y rendimiento. Para ello, necesitamos
utilizar, de nuevo, metadatos:

@Entity
@NamedNativeQuery(name=Pelicula.BUSCAR_TODOS, query="
SELECT * FROM PELICULA")
public class Pelicula {
   public static final String BUSCAR_TODOS = "Pelicula.
buscarTodos";
   ...
}
Persistencia en la capa Web
JSTL (JavaServer pages Standard Tag Library)
A partir de JSP 1.2. se introduce un conjunto de
librerías en la especificación, pasando a ser
estándar.

JSTL consta de los siguientes grupos de
etiquetas:

http://java.sun.com/jsp/jstl/core
http://java.sun.com/jsp/jstl/xml
http://java.sun.com/jsp/jstl/fmt
http://java.sun.com/jsp/jstl/sql
JSTL (JavaServer pages Standard Tag Library)
Expression language (EL)

JSTL define un lenguaje de expresiones (EL),
que facilita enormemente el tratamiento de
información.

Las expresiones se indican de la forma
${expresion).
JSTL (JavaServer pages Standard Tag Library)
La librería core.

En las páginas que la usen deberemos incluir la siguiente
directiva:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %
>

out

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %
>
<br> <c:out value="1+2+3"/>
<br> <c:out value="${1+2+3}"/>
<br> <c:out value="${param.nombreParametro}"/>
<br> <c:out value="${sessionScope.variableDeSesion}"/>
JSTL (JavaServer pages Standard Tag Library)
set

Guarda información en una variable, tiene los siguientes
atributos:
- var. Nombre de la variable
- scope. Ámbito de la variable, admite los valores page,
session y application.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %
>
<c:set var="variableDePagina" scope="page">
Esta información se guarda en la página
</c:set>

${variableDePagina}
JSTL (JavaServer pages Standard Tag Library)
if
Procesa el cuerpo de la etiqueta si la condición se evalúa a
cierto. La condición se indica en el atributo
test.

Ejemplo:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %
>
<c:if test="${empty param.nombre}">
Parámetro ‘nombre’ no definido.
</c:if>
JSTL (JavaServer pages Standard Tag Library)
choose, when y otherwise
Procesa condiciones múltiples, se procesa el cuerpo del
primer when cuya condición especificada en el
atributo test se evalúa a cierto.

 Si ninguna de las condiciones se cumple, se procesa el
cuerpo de otherwise en caso de que aparezca.
JSTL (JavaServer pages Standard Tag Library)
Ejemplo:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %
>
<c:choose>
<c:when test="${empty param.nombre}">
Parámetro ‘nombre’ no definido.
</c:when>
<c:otherwise>

Valor del parámetro ‘nombre’:
${param.nombre}
</c:otherwise>
</c:choose>
JSTL (JavaServer pages Standard Tag Library)
forEach y forTokens.
forEach consta de los siguientes atributos:
- items. Indica la colección sobre la que iterar
- var. Indica el nombre de la variable donde se guardará el elemento en
curso.
- varStatus. Indica el nombre de la variable donde se guardará el estado
de la iteración.

En cada iteración, la variable indicada en var irá tomando el valor del
elemento en curso.A través de la variable indicada en varStatus podemos
acceder a las siguientes propiedades:

- index. Posición del elemento en curso (comienza con 0).
- count. Número de iteraciones (comienza con 1).
- first. Valor booleano que indica si es la primera iteración.
- last. Valor booleano que indica si es la última iteración.
JSTL (JavaServer pages Standard Tag Library)
forTokens permite partir una cadena en fragmentos y
recorrer cada uno de éstos, consta de los
siguientes atributos:

- items. Cadena que se quiere tokenizar.
- var. Indica el nombre de la variable donde se guardará el
fragmento en curso.
- delims. Cadena con todos los caracteres que actúan como
delimitador.
- varStatus. Indica el nombre de la variable donde se
guardará el estado de la iteración.
JSTL (JavaServer pages Standard Tag Library)
   Ejemplo:
   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"
   %>
   <c:forEach items="${header}" var="cabecera">
   ${cabecera}
   </c:forEach>

   <%
   String []cadenas={"uno","dos","tres"};
   pageContext.setAttribute("cadenas",cadenas);
   %>

   <c:forEach items="${pageScope.cadenas}" var="cadena">
   ${cadena}
   </c:forEach>
JSTL (JavaServer pages Standard Tag Library)

<c:forEach items="${param}" var="parametro">
Nombre: ${parametro.key}
Valor: ${parametro.value}

</c:forEach>

<c:forTokens items="cero, uno, dos, tres, cuatro, cinco"
var="token" varStatus="status" delims=",">
${status.index}.- ${token}
</c:forTokens>
JSTL (JavaServer pages Standard Tag Library)
redirect
Redirige a la dirección especificada en el atributo url, y aborta
el procesamiento de la página actual.

Ejemplo:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %
>
<c:if test="${param.clave!=’secreto’}">
<c:redirect url="login.jsp"/>
</c:if>
JSTL (JavaServer pages Standard Tag Library)
Control de errores con catch
Con <c:catch> podemos capturar excepciones, sin que se
aborte la ejecución de la página al
producirse un error.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %
>
<c:catch var="error01">
<%=Integer.parseInt(request.getParameter("parametro"))%>
</c:catch>
<c:if test="${not empty error01}">
Se produjo un error: ${error01}
</c:if>
JSTL (JavaServer pages Standard Tag Library)
La librería formatting

Contiene etiquetas que realizan diversas funciones
relacionadas con formato y localización,
comentamos únicamente formatDate y formatNumber.

La directiva para poder utilizarla es:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %
>
JSTL (JavaServer pages Standard Tag Library)
formatDate

Permite formatear fechas. Tiene, entre otros, los siguientes
atributos:
- type. Permite los valores time (sólo hora), date (sólo fecha)
y both (ambos).
  El valor por defecto es date.
-pattern. Permite controlar el formato, podemos ver cómo
estructurarlo en la clase
java.text.SimpleDateFormat del API de Java.
value. La fecha en sí o la variable que la contiene.
JSTL (JavaServer pages Standard Tag Library)
   Ejemplo

   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"
   %>
   <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="
   fmt"
   %>
   <%pageContext.setAttribute("fecha",new java.util.Date());
   %>

   Hoy es:
   <fmt:formatDate value="${pageScope.fecha}"
   pattern="dd/MM/yyyy"/>
LET'S CODE !!!
PREGUNTAS ?
WE ROCK JAVA !!!

Más contenido relacionado

Destacado

Destacado (15)

Complementar el silabo
Complementar el silaboComplementar el silabo
Complementar el silabo
 
Civil rights quiz
Civil rights quizCivil rights quiz
Civil rights quiz
 
ELECTRIC FIELD -LESSON -4
ELECTRIC FIELD -LESSON -4ELECTRIC FIELD -LESSON -4
ELECTRIC FIELD -LESSON -4
 
Qué es el simce (1)
Qué es el simce (1)Qué es el simce (1)
Qué es el simce (1)
 
njmea15-flipband
njmea15-flipbandnjmea15-flipband
njmea15-flipband
 
Liberal 20 septiembre 2014
Liberal 20 septiembre 2014 Liberal 20 septiembre 2014
Liberal 20 septiembre 2014
 
Products
ProductsProducts
Products
 
Геймификация обучения
Геймификация обученияГеймификация обучения
Геймификация обучения
 
De ideale relatie
De ideale relatieDe ideale relatie
De ideale relatie
 
Fundamentos de investigacion comun
Fundamentos de investigacion comunFundamentos de investigacion comun
Fundamentos de investigacion comun
 
Rositaa
RositaaRositaa
Rositaa
 
[ES] Introducción a las Aplicaciones Web con Java
[ES] Introducción a las Aplicaciones Web con Java[ES] Introducción a las Aplicaciones Web con Java
[ES] Introducción a las Aplicaciones Web con Java
 
la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...
 
Mision y vision kelloggs
Mision y vision kelloggsMision y vision kelloggs
Mision y vision kelloggs
 
Grcd (microsoft power point - rcd_introdu��o
Grcd (microsoft power point - rcd_introdu��oGrcd (microsoft power point - rcd_introdu��o
Grcd (microsoft power point - rcd_introdu��o
 

Similar a [ES] Manejadores de persistencia

Similar a [ES] Manejadores de persistencia (20)

Jpa
JpaJpa
Jpa
 
P2C2 Introducción a JEE5
P2C2 Introducción a JEE5P2C2 Introducción a JEE5
P2C2 Introducción a JEE5
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
 
Java Persistence Api (Jpa)
Java Persistence Api (Jpa)Java Persistence Api (Jpa)
Java Persistence Api (Jpa)
 
Introducción práctica a JPA2
Introducción práctica a JPA2Introducción práctica a JPA2
Introducción práctica a JPA2
 
feedback
feedbackfeedback
feedback
 
T3 - JPA
T3 - JPAT3 - JPA
T3 - JPA
 
Introducción a Java Persistence API
Introducción a Java Persistence APIIntroducción a Java Persistence API
Introducción a Java Persistence API
 
Java Web - JSP
Java Web - JSPJava Web - JSP
Java Web - JSP
 
Persistence
PersistencePersistence
Persistence
 
Java persitence api
Java persitence apiJava persitence api
Java persitence api
 
jsf
jsfjsf
jsf
 
Introduccion a JPA
Introduccion a JPAIntroduccion a JPA
Introduccion a JPA
 
TopLink Jpa Parte 1 - Leonardo Torres Altez
TopLink Jpa Parte 1 - Leonardo Torres AltezTopLink Jpa Parte 1 - Leonardo Torres Altez
TopLink Jpa Parte 1 - Leonardo Torres Altez
 
Carro De Compras
Carro De ComprasCarro De Compras
Carro De Compras
 
Jpa
JpaJpa
Jpa
 
Persistencia de datos en JAVA. Conversión JPA
Persistencia de datos en JAVA. Conversión JPAPersistencia de datos en JAVA. Conversión JPA
Persistencia de datos en JAVA. Conversión JPA
 
P2C5 Introducción a JEE5 - II
P2C5 Introducción a JEE5 - IIP2C5 Introducción a JEE5 - II
P2C5 Introducción a JEE5 - II
 
Persistencia avanzada de datos en Java. JPA
Persistencia avanzada de datos en Java. JPAPersistencia avanzada de datos en Java. JPA
Persistencia avanzada de datos en Java. JPA
 
Introduccion java
Introduccion javaIntroduccion java
Introduccion java
 

Último

Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 

Último (20)

Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 

[ES] Manejadores de persistencia

  • 1. Let's Rock Java Fundamentos de Java Enterprise Edition con JDeveloper Eudris Cabrera Rodriguez Ingeniero Telemático Senior Software Developer Skype:eudriscabrera LinkedIn:http://www.linkedin.com/in/eudriscabrera Diciembre 2011, Santiago de los Caballeros, R. D.
  • 2. Objetivos Aprender los conceptos fundamentales sobre los manejadores de persistencia en Java y su implementación en una aplicación empresarial Java (JEE).
  • 3. Agenda ○ Manejadores de persistencia ■ Conceptos y Definiciones ■ Introdución a Java Persistence API (JPA) ■ Conceptos Avanzados de Java Persistence API (JPA) ○ Persistencia en la capa web ○ JSTL (JavaServer pages Standard Tag Library)
  • 4. Conceptos y definiciones En Java solucionamos problemas de negocio a través de objetos, los cuales tienen estado y comportamiento. Sin embargo, las bases de datos relacionales almacenan la información mediante tablas, filas, y columnas, de manera que para almacenar un objeto hay que realizar una correlación entre el sistema orientado a objetos de Java y el sistema relacional de nuestra base de datos. JPA (Java Persistence API - API de Persistencia en Java) es una abstracción sobre JDBC que nos permite realizar dicha correlación de forma sencilla, realizando por nosotros toda la conversión entre nuestros objetos y las tablas de una base de datos.
  • 5. Conceptos y definiciones Esta conversión se llama ORM (Object Relational Mapping - Mapeo Relacional de Objetos), y puede configurarse a través de metadatos (mediante xml o anotaciones). Por supuesto, JPA también nos permite seguir el sentido inverso, creando objetos a partir de las tablas de una base de datos, y también de forma transparente. A estos objetos los llamaremos desde ahora entidades (entities). JPA establece una interface común que es implementada por un proveedor de persistencia de nuestra elección (como Hibernate, Eclipse Link, etc), de manera que podemos elegir en cualquier momento el proveedor que más se adecue a nuestras necesidades. Así, es el proveedor quién realiza el trabajo, pero siempre funcionando bajo la API de JPA.
  • 6. Introdución a Java Persistence API (JPA) UNA ENTIDAD SIMPLE: import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Pelicula { @Id @GeneratedValue private Long id; private String titulo; private int duracion; // Getters y Setters
  • 7. Introdución a Java Persistence API (JPA) Las entidades suelen ser POJOs. La clase Pelicula se ha anotado con @Entity, lo cual informa al proveedor de persistencia que cada instancia de esta clase es una entidad. Para ser válida, toda entidad debe: - Tener un constructor por defecto - Ser una clase de primer nivel (no interna) - No ser final - Implementar la interface java.io.Serializabe si es accedida remotamente La configuración de mapeo puede ser especificada mediante un archivo de configuración XML, o mediante anotaciones. A esta configuración del mapeo la llamamos metadatos.
  • 8. Introdución a Java Persistence API (JPA) IDENTIDAD: Todas las entidades tienen que poseer una identidad que las diferencie del resto, por lo que deben contener una propiedad marcada con la anotación @Id (es aconsejable que dicha propiedad sea de un tipo que admita valores null, como Integer en lugar de int). CONFIGURACIÓN POR DEFECTO : JPA aplica a las entidades que maneja una configuración por defecto, de manera que una entidad es funcional con una mínima cantidad de información (las anotaciones @Entity y @Id en nuestro caso).
  • 9. Introdución a Java Persistence API (JPA) Con esta configuración por defecto, todas las entidades del tipo Pelicula serán mapeadas a una tabla de la base de datos llamada PELICULA, y cada una de sus propiedades será mapeada a una columna con el mismo nombre (la propiedad id será mapeada en la columna ID, la propiedad título será mapeada en la columna TITULO, etc). Sin embargo, no siempre es posible ceñirse a los valores de la configuración por defecto: imaginemos que tenemos que trabajar con una base de datos heredada, con nombres de tablas y filas ya definidos.
  • 10. Introdución a Java Persistence API (JPA) En ese caso, podemos configurar el mapeo de manera que se ajuste a dichas tablas y filas: @Entity @Table(name = "TABLA_PELICULAS") public class Pelicula { @Id @GeneratedValue @Column(name = "ID_PELICULA") private Long id; ... }
  • 11. Introdución a Java Persistence API (JPA) La anotación @Table nos permite configurar el nombre de la tabla donde queremos almacenar la entidad mediante el atributo name. Así mismo, mediante la anotación @Column podemos configurar el nombre de la columna donde se almacenará una propiedad, si dicha propiedad puede contener un valor null, etc.
  • 13. Introdución a Java Persistence API (JPA) LECTURA TEMPRANA Y LECTURA DEMORADA JPA nos permite leer una propiedad desde la base de datos la primera vez que un cliente intenta leer su valor (lectura demorada). Esto puede ser útil si la propiedad contiene un objeto de gran tamaño: @Basic(fetch = FetchType.LAZY) private Imagen portada; El comportamiento por defecto de la mayoría de tipos Java es el contrario (lectura temprana). Este comportamiento, a pesar de ser implícito, puede ser declarado explícitamente de la siguiente manera: @Basic(fetch = FetchType.EAGER) private Imagen portada;
  • 14. Introdución a Java Persistence API (JPA) ASOCIACIONES Cuando queremos mapear colecciones de entidades, debemos usar asociaciones. Estas asociaciones pueden ser de dos tipos: - Asociaciones unidireccionales - Asociaciones bidireccionales Las asociaciones unidireccionales reflejan un objeto que tiene una referencia a otro objeto (la información puede viajar en una dirección). Por el contrario, las asociaciones bidireccionales reflejan dos objetos que mantienen referencias al objeto contrario (la información puede viajar en dos direcciones).
  • 15. Introdución a Java Persistence API (JPA) Además del concepto de dirección, existe otro concepto llamado cardinalidad, que determina cuántos objetos pueden haber en cada extremo de la asociación.
  • 16. Introdución a Java Persistence API (JPA) ASOCIACIONES UNIDIRECCIONALES @Entity @Entity public class Cliente { public class Direccion { @Id @Id @GeneratedValue GeneratedValue private Long id; private Long id; @OneToOne private String calle; private Direccion private String ciudad; direccion; private String pais; private Integer // Getters y setters codigoPostal; } // Getters y setters }
  • 17. Introdución a Java Persistence API (JPA) Otro tipo de asociación muy común es la de tipo uno-a- muchos (one-to-many) unidireccional. @Entity public class Cliente { @Id @GeneratedValue private Long id; @OneToMany private List direcciones; // Getters y setters }
  • 18. Introdución a Java Persistence API (JPA) ASOCIACIONES BIDIRECCIONALES En las asociaciones bidireccionales, ambos extremos de la relación mantienen una referencia al extremo contrario. En este caso, el dueño de la relación debe ser especificado explícitamente, de manera que JPA pueda realizar el mapeo correctamente.
  • 19. Introdución a Java Persistence API (JPA) Ejemplo de bidireccionalidad en una relación de tipo uno-a-uno @Entity @Entity public class Mujer { public class Marido { @Id @Id @GeneratedValue @GeneratedValue private Long id; private Long id; @OneToOne @OneToOne private Marido marido; (mappedBy = "marido") private Mujer mujer; // Getters y setters } }
  • 20. Introdución a Java Persistence API (JPA) PERSISTENCIA : El concepto de persistencia implica el hecho de almacenar nuestras entidades (objetos Java de tipo POJO) en un sistema de almacenamiento, normalmente una base de datos relacional (tablas, filas, y columnas). Más allá del proceso de almacenar entidades en una base de datos, todo sistema de persistencia debe permitir recuperar, actualizar y eliminar dichas entidades. Estas cuatro operaciones se conocen como operaciones CRUD (Create, Read, Update, Delete - Crear, Leer, Actualizar, Borrar). JPA maneja todas las operaciones CRUD a través de la interface EntityManager.
  • 21. Introdución a Java Persistence API (JPA) PERSISTIR UNA ENTIDAD : public class Main { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("introduccionJPA"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); Pelicula pelicula = new Pelicula(); pelicula.setTitulo("Pelicula uno"); pelicula.setDuracion(142); tx.begin(); try { em.persist(pelicula); tx.commit(); } catch(Exception e) { tx.rollback() } em.close(); emf.close(); } }
  • 22. Introdución a Java Persistence API (JPA) LEER UNA ENTIDAD Leer una entidad previamente persistida en la base de datos para construir un objeto Java. Podemos llevar a cabo de dos maneras distintas: - Obteniendo un objeto real - Obteniendo una referencia a los datos persistidos De la primera manera, los datos son leídos (por ejemplo, con el método find()) desde la base de datos y almacenados en una instancia de la entidad: Pelicula p = em.find(Pelicula.class, id);
  • 23. Introdución a Java Persistence API (JPA) La segunda manera de leer una entidad nos permite obtener una referencia a los datos almacenados en la base de datos, de manera que el estado de la entidad será leído de forma demorada (en el primer acceso a cada propiedad), no en el momento de la creación de la entidad: Pelicula p = em.getReference(Pelicula.class, id);
  • 24. Introdución a Java Persistence API (JPA) ACTUALIZAR UNA ENTIDAD Mediante el método merge() de EntityManager podemos tener nuestra entidad gestionada y sincronizada tx.begin(); em.persist(pelicula); tx.commit(); em.detach(pelicula); // otras operaciones em.merge(pelicula);
  • 25. Introdución a Java Persistence API (JPA) ELIMINAR UNA ENTIDAD em.remove(pelicula); Cuando existe una asociación uno-a-uno y uno-a-muchos entre dos entidades, y eliminas la entidad dueña de la relación, la/s entidad/es del otro lado de la relación no son eliminada/s de la base de datos (este es el comportamiento por defecto), pudiendo dejar así entidades persistidas sin ninguna entidad que haga referencia a ellas. Estas entidades se conocen como entidades huérfanas. Sin embargo, podemos configurar nuestras asociaciones para que eliminen de manera automática todas las entidades subordinadas de la relación
  • 26. Introdución a Java Persistence API (JPA) OPERACIONES EN CASCADA Este tipo de operaciones permiten establecer la forma en que deben propagarse ciertos eventos (como persistir, eliminar, actualizar, etc) entre entidades que forman parte de una asociación. La forma general de establecer cómo se realizarán estas operaciones en cascada se define mediante el atributo cascade de las anotaciones de asociación: @OneToOne(cascade = CascadeType.REMOVE) private Descuento descuento;
  • 27. Introdución a Java Persistence API (JPA) CascadeType.PERSIST .REMOVE .MERGE .REFRESH .DETACH .ALL La última constante, CascadeType.ALL, hace referencia a todas las posibles operaciones que pueden ser propagadas, y por tanto engloba en si misma el comportamiento del resto de constantes. También podemos configurar varias operaciones en cascada de la lista superior usando un array de constantes CascadeType:
  • 28. Introdución a Java Persistence API (JPA) @OneToOne(cascade = { CascadeType.MERGE, CascadeType.REMOVE, }) private Descuento descuento;
  • 30. Conceptos Avanzados de Java Persistence API (JPA) JPQL (Java Persistence Query Language - Lenguaje de Consulta de Persistencia en Java), un potente lenguaje de consulta orientado a objetos que va incluido con JPA. JPQL BÁSICO JPQL nos permite realizar consultas en base a multitud de criterios (como por ejemplo el valor de una propiedad, o condiciones booleanas), y obtener más de un objeto por consulta. SELECT p FROM Pelicula p
  • 31. Conceptos Avanzados de Java Persistence API (JPA) SENTENCIAS CONDICIONALES El primero de ellos es el de consulta condicional, el cual es aplicado añadiendo la cláusula WHERE en nuestra sentencia JPQL. SELECT p FROM Pelicula p WHERE p.duracion < 120
  • 32. Conceptos Avanzados de Java Persistence API (JPA) PARÁMETROS DINÁMICOS Podemos añadir parámetros dinámicamente a nuestras sentencias JPQL de dos formas: por posición y por nombre. La sentencia siguiente acepta un parámetro por posición (?1): SELECT p FROM Pelicula p WHERE p.titulo = ?1 Y la siguiente, acepta un parámetro por nombre (:titulo): SELECT p FROM Pelicula p WHERE p.titulo = :titulo
  • 33. Conceptos Avanzados de Java Persistence API (JPA) EJECUCIÓN DE SENTENCIAS JPQL El lenguaje JPQL es integrado a través de implementaciones de la interface Query. Dichas implementaciones se obtienen a través de nuestro querido amigo EntityManager, mediante diversos métodos de factoría. De estos, los tres más usados (y los únicos que explicaremos aquí) son: createQuery(String jpql) createNamedQuery(String name) createNativeQuery(String sql)
  • 34. Conceptos Avanzados de Java Persistence API (JPA) CONSULTAS CON NOMBRE (ESTÁTICAS) Las consultas con nombre son diferentes de las sentencias dinámicas que hemos visto hasta ahora en el sentido de que una vez definidas, no pueden ser modificadas: son leídas y transformadas en sentencias SQL cuando el programa arranca por primera vez, en lugar de cada vez que son ejecutadas. Este comportamiento estático las hace más eficientes, y por tanto ofrecen un mejor rendimiento. Las consultas con nombre son definidas mediante metadatos (recuerda que los metadatos se definen mediante anotaciones o configuración XML), como puedes ver en este ejemplo: @Entity @NamedQuery(name="buscarTodos", query="SELECT p FROM Pelicula p")
  • 35. Conceptos Avanzados de Java Persistence API (JPA) CONSULTAS NATIVAS SQL El tercer y último tipo de consultas que nos queda por ver requiere una sentencia SQL nativa en lugar de una sentencia JPQL: String sql = "SELECT * FROM PELICULA"; Query query = em.createNativeQuery(sql);
  • 36. Conceptos Avanzados de Java Persistence API (JPA) Las consultas SQL nativas pueden ser definidas de manera estática como hicimos con las consultas con nombre, obteniendo los mismos beneficios de eficiencia y rendimiento. Para ello, necesitamos utilizar, de nuevo, metadatos: @Entity @NamedNativeQuery(name=Pelicula.BUSCAR_TODOS, query=" SELECT * FROM PELICULA") public class Pelicula { public static final String BUSCAR_TODOS = "Pelicula. buscarTodos"; ... }
  • 37. Persistencia en la capa Web
  • 38. JSTL (JavaServer pages Standard Tag Library) A partir de JSP 1.2. se introduce un conjunto de librerías en la especificación, pasando a ser estándar. JSTL consta de los siguientes grupos de etiquetas: http://java.sun.com/jsp/jstl/core http://java.sun.com/jsp/jstl/xml http://java.sun.com/jsp/jstl/fmt http://java.sun.com/jsp/jstl/sql
  • 39. JSTL (JavaServer pages Standard Tag Library) Expression language (EL) JSTL define un lenguaje de expresiones (EL), que facilita enormemente el tratamiento de información. Las expresiones se indican de la forma ${expresion).
  • 40. JSTL (JavaServer pages Standard Tag Library) La librería core. En las páginas que la usen deberemos incluir la siguiente directiva: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > out <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > <br> <c:out value="1+2+3"/> <br> <c:out value="${1+2+3}"/> <br> <c:out value="${param.nombreParametro}"/> <br> <c:out value="${sessionScope.variableDeSesion}"/>
  • 41. JSTL (JavaServer pages Standard Tag Library) set Guarda información en una variable, tiene los siguientes atributos: - var. Nombre de la variable - scope. Ámbito de la variable, admite los valores page, session y application. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > <c:set var="variableDePagina" scope="page"> Esta información se guarda en la página </c:set> ${variableDePagina}
  • 42. JSTL (JavaServer pages Standard Tag Library) if Procesa el cuerpo de la etiqueta si la condición se evalúa a cierto. La condición se indica en el atributo test. Ejemplo: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > <c:if test="${empty param.nombre}"> Parámetro ‘nombre’ no definido. </c:if>
  • 43. JSTL (JavaServer pages Standard Tag Library) choose, when y otherwise Procesa condiciones múltiples, se procesa el cuerpo del primer when cuya condición especificada en el atributo test se evalúa a cierto. Si ninguna de las condiciones se cumple, se procesa el cuerpo de otherwise en caso de que aparezca.
  • 44. JSTL (JavaServer pages Standard Tag Library) Ejemplo: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > <c:choose> <c:when test="${empty param.nombre}"> Parámetro ‘nombre’ no definido. </c:when> <c:otherwise> Valor del parámetro ‘nombre’: ${param.nombre} </c:otherwise> </c:choose>
  • 45. JSTL (JavaServer pages Standard Tag Library) forEach y forTokens. forEach consta de los siguientes atributos: - items. Indica la colección sobre la que iterar - var. Indica el nombre de la variable donde se guardará el elemento en curso. - varStatus. Indica el nombre de la variable donde se guardará el estado de la iteración. En cada iteración, la variable indicada en var irá tomando el valor del elemento en curso.A través de la variable indicada en varStatus podemos acceder a las siguientes propiedades: - index. Posición del elemento en curso (comienza con 0). - count. Número de iteraciones (comienza con 1). - first. Valor booleano que indica si es la primera iteración. - last. Valor booleano que indica si es la última iteración.
  • 46. JSTL (JavaServer pages Standard Tag Library) forTokens permite partir una cadena en fragmentos y recorrer cada uno de éstos, consta de los siguientes atributos: - items. Cadena que se quiere tokenizar. - var. Indica el nombre de la variable donde se guardará el fragmento en curso. - delims. Cadena con todos los caracteres que actúan como delimitador. - varStatus. Indica el nombre de la variable donde se guardará el estado de la iteración.
  • 47. JSTL (JavaServer pages Standard Tag Library) Ejemplo: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:forEach items="${header}" var="cabecera"> ${cabecera} </c:forEach> <% String []cadenas={"uno","dos","tres"}; pageContext.setAttribute("cadenas",cadenas); %> <c:forEach items="${pageScope.cadenas}" var="cadena"> ${cadena} </c:forEach>
  • 48. JSTL (JavaServer pages Standard Tag Library) <c:forEach items="${param}" var="parametro"> Nombre: ${parametro.key} Valor: ${parametro.value} </c:forEach> <c:forTokens items="cero, uno, dos, tres, cuatro, cinco" var="token" varStatus="status" delims=","> ${status.index}.- ${token} </c:forTokens>
  • 49. JSTL (JavaServer pages Standard Tag Library) redirect Redirige a la dirección especificada en el atributo url, y aborta el procesamiento de la página actual. Ejemplo: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > <c:if test="${param.clave!=’secreto’}"> <c:redirect url="login.jsp"/> </c:if>
  • 50. JSTL (JavaServer pages Standard Tag Library) Control de errores con catch Con <c:catch> podemos capturar excepciones, sin que se aborte la ejecución de la página al producirse un error. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > <c:catch var="error01"> <%=Integer.parseInt(request.getParameter("parametro"))%> </c:catch> <c:if test="${not empty error01}"> Se produjo un error: ${error01} </c:if>
  • 51. JSTL (JavaServer pages Standard Tag Library) La librería formatting Contiene etiquetas que realizan diversas funciones relacionadas con formato y localización, comentamos únicamente formatDate y formatNumber. La directiva para poder utilizarla es: <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" % >
  • 52. JSTL (JavaServer pages Standard Tag Library) formatDate Permite formatear fechas. Tiene, entre otros, los siguientes atributos: - type. Permite los valores time (sólo hora), date (sólo fecha) y both (ambos). El valor por defecto es date. -pattern. Permite controlar el formato, podemos ver cómo estructurarlo en la clase java.text.SimpleDateFormat del API de Java. value. La fecha en sí o la variable que la contiene.
  • 53. JSTL (JavaServer pages Standard Tag Library) Ejemplo <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix=" fmt" %> <%pageContext.setAttribute("fecha",new java.util.Date()); %> Hoy es: <fmt:formatDate value="${pageScope.fecha}" pattern="dd/MM/yyyy"/>