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

La actualidad más candente

Jetpack Compose.pdf
Jetpack Compose.pdfJetpack Compose.pdf
Jetpack Compose.pdfSumirVats
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepGuo Albert
 
Dependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake PatternDependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake PatternDebasish Ghosh
 
OData Introduction and Impact on API Design (Webcast)
OData Introduction and Impact on API Design (Webcast)OData Introduction and Impact on API Design (Webcast)
OData Introduction and Impact on API Design (Webcast)Apigee | Google Cloud
 
Spring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutesSpring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutesVMware Tanzu
 
Spring Boot and REST API
Spring Boot and REST APISpring Boot and REST API
Spring Boot and REST API07.pallav
 
GraphQL Story: Intro To GraphQL
GraphQL Story: Intro To GraphQLGraphQL Story: Intro To GraphQL
GraphQL Story: Intro To GraphQLRiza Fahmi
 
Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!Julien Truffaut
 
Java EE Introduction
Java EE IntroductionJava EE Introduction
Java EE Introductionejlp12
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Scott Wlaschin
 
The Scala Programming Language
The Scala Programming LanguageThe Scala Programming Language
The Scala Programming LanguageHaim Michael
 

La actualidad más candente (20)

Jetpack Compose.pdf
Jetpack Compose.pdfJetpack Compose.pdf
Jetpack Compose.pdf
 
Le Wagon - React 101
Le Wagon - React 101Le Wagon - React 101
Le Wagon - React 101
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By Step
 
Spring Core
Spring CoreSpring Core
Spring Core
 
Dependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake PatternDependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake Pattern
 
Grails Spring Boot
Grails Spring BootGrails Spring Boot
Grails Spring Boot
 
OData Introduction and Impact on API Design (Webcast)
OData Introduction and Impact on API Design (Webcast)OData Introduction and Impact on API Design (Webcast)
OData Introduction and Impact on API Design (Webcast)
 
Spring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutesSpring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutes
 
Spring Boot and REST API
Spring Boot and REST APISpring Boot and REST API
Spring Boot and REST API
 
Simple object access protocol(soap )
Simple object access protocol(soap )Simple object access protocol(soap )
Simple object access protocol(soap )
 
GraphQL Story: Intro To GraphQL
GraphQL Story: Intro To GraphQLGraphQL Story: Intro To GraphQL
GraphQL Story: Intro To GraphQL
 
Express JS
Express JSExpress JS
Express JS
 
Its time to React.js
Its time to React.jsIts time to React.js
Its time to React.js
 
Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!Implicit parameters, when to use them (or not)!
Implicit parameters, when to use them (or not)!
 
Java EE Introduction
Java EE IntroductionJava EE Introduction
Java EE Introduction
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
 
Spring Data JPA
Spring Data JPASpring Data JPA
Spring Data JPA
 
The Scala Programming Language
The Scala Programming LanguageThe Scala Programming Language
The Scala Programming Language
 
API for Beginners
API for BeginnersAPI for Beginners
API for Beginners
 
Introduction à JPA (Java Persistence API )
Introduction à JPA  (Java Persistence API )Introduction à JPA  (Java Persistence API )
Introduction à JPA (Java Persistence API )
 

Destacado

[ES] Introducción a Java EE 7 & HTML 5
[ES] Introducción a Java EE 7 & HTML 5[ES] Introducción a Java EE 7 & HTML 5
[ES] Introducción a Java EE 7 & HTML 5Eudris Cabrera
 
[ES] Introducción a Java EE 7
[ES] Introducción a Java EE 7[ES] Introducción a Java EE 7
[ES] Introducción a Java EE 7Eudris Cabrera
 
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...Eudris Cabrera
 
Taller introducción Java EE 7 @UAPA
Taller introducción Java EE 7  @UAPATaller introducción Java EE 7  @UAPA
Taller introducción Java EE 7 @UAPAEudris Cabrera
 
[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven[ES] Primeros pasos con Maven
[ES] Primeros pasos con MavenEudris Cabrera
 
Truth or consequences
Truth or consequencesTruth or consequences
Truth or consequencesjdinkens0002
 
ELECTRIC FIELD -LESSON -4
ELECTRIC FIELD -LESSON -4ELECTRIC FIELD -LESSON -4
ELECTRIC FIELD -LESSON -4sujameryll
 
Геймификация обучения
Геймификация обученияГеймификация обучения
Геймификация обученияIl Gam
 
Fundamentos de investigacion comun
Fundamentos de investigacion comunFundamentos de investigacion comun
Fundamentos de investigacion comunrangelito18
 
[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 JavaEudris Cabrera
 
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...najwa sabouk
 

Destacado (20)

[ES] Introducción a Java EE 7 & HTML 5
[ES] Introducción a Java EE 7 & HTML 5[ES] Introducción a Java EE 7 & HTML 5
[ES] Introducción a Java EE 7 & HTML 5
 
[ES] Introducción a Java EE 7
[ES] Introducción a Java EE 7[ES] Introducción a Java EE 7
[ES] Introducción a Java EE 7
 
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...
 
Taller introducción Java EE 7 @UAPA
Taller introducción Java EE 7  @UAPATaller introducción Java EE 7  @UAPA
Taller introducción Java EE 7 @UAPA
 
[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven
 
Truth or consequences
Truth or consequencesTruth or consequences
Truth or consequences
 
Mecánica cuántica
Mecánica cuánticaMecánica cuántica
Mecánica cuántica
 
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...
 

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

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
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
 
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
 
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
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 

Último (16)

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
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
 
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
 
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
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 

[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"/>