SlideShare una empresa de Scribd logo
Hibernate / JPA @luce4
¿Qué deberíamos saber?
•

Relaciones simples @OneToMany y @ManyToOne

•

Cascades

•

Tipos de fetching
¿Qué vamos a ver?
•

Dudas?

•

El código está en github.
¿Qué vamos a ver?
•

Consultas

•

Entender la sesión...
Entidades y estados en
detalle
Entidades y estados en detalle
Entidades y estados en detalle
Entidades y estados en detalle
•

La sesión (y entityManager) hace varias cosas:
o Dirty Checking -> sólo actualizar las cosas que han cambiado.

o Actúa de caché de primer nivel -> sólo lee si no lo tiene en sesión
o Puede asegurar identidad de objetos
o Puede extender la conversación
Entidades y estados en detalle
Entidades y estados en detalle
Entendiendo el estado
Persistent
Entidades y estados en detalle
•

Para ver el estado Persistent...
o Cread un objeto (Pepe)
o Guardad (Pepe)
o Cambiad un valor del objeto (Lola) y no llamo a save/persist/update...
o Haced un commit
o En otra sesión o en la BD, leed el valor.

Qué pasa?
Se persiste el valor
Entidades y estados en detalle
•
•
•
•

Yo personalmente habría esperado leer Pepe.
No llamamos a update explícitamente
Hay 1 transacción de base de datos
Cuando hacemos un save() y un rollback() no recupera el estado del objeto
en Java (obviamente)
o get() -> recupero Pepe
o cambio a Lola
o rollback() -> en BD sigue Pepe
o mi modelo Java sigue poniendo Lola
Entidades y estados en detalle
•

Para ver el estado Persistent tras un get/load
o Recuperad un objeto de BD
o Cambiad un valor del objeto
o Haced un commit

Qué pasa?
-> Sí ha cambiado el valor.
Entidades y estados en detalle
•
•
•

Esta política se llama write-behind.
Implica que las entidades en estado PERSISTENT porque
o o se ha llamado save/update/persist... dentro de una sesión...
o o se han recuperado de base de datos con un get/load...
guardan los cambios hechos hasta que se hace un commit();

•
•

Problemas?
Dudas?
Entidades y estados en detalle
•

•

Haced el mismo ejercicio que antes, pero cuando recuperéis la sesión llamad
a:
o session.setFlushMode(FlushMode.Manual);

Lo que inserta NO es la transacción es que POR DEFECTO (FlushMode.AUTO),
Hibernate hace un flush cuando haces un commit();
Entidades y estados en detalle
•

Si una entidad está en estado Persistent y hacemos un flush(), los cambios
van a la BD
Entendiendo el estado
Detached
Entidades y estados en detalle
•
•

Probadlo!
o Abrid una sesión, buscad un objeto, cerrad la sesión
o Modificad el objeto
o Abrid la sesión, buscadlo de nuevo...
Ahora tenemos 2 objetos diferentes (en Java) apuntando a la misma fila de la
BD...
Entidades y estados en detalle
•

Problemas con entidades detached e identidad:
o Abrid una sesión, buscad un objeto, cerrad la sesión
o Modificad el objeto
o Abrid la sesión, buscadlo de nuevo...
o Guardad el primer objeto (el que ha sido modificado) con un update
-> ERROR!

•

Si hago un update() ANTES de buscar...
o Todo funciona correctamente, update sincroniza el estado a persistent en
vez de detached.
Entidades y estados en detalle
•

Este caso es poco habitual pero no tan raro cómo parece:
o Típicamente no harás una consulta del elemento directamente y luego un
update().
o Pero sí que es más habitual que ALGO haga una consulta que recupere un
elemento detached (típicamente una asociación con Eager, una
precarga...)
Entidades y estados en detalle
•

Puedo pasar de detached a persistent de cuatro formas:
o session.update() / session.saveOrUpdate()
o session.merge (me crea un objeto "sincronizado")
 Probadlo!
load(1), cerrando sesión
modificando
load(1), merge(), update()/saveOrUpdate()
o session.evict() (sacar de la sesión el objeto que acabo de recuperar)
o session.lock() (igual que el merge si sé con seguridad que no he tocado el
objeto)

•
•
•
Entidades y estados en detalle
•

Usually update() or saveOrUpdate() are used in the following scenario:
o the application loads an object in the first session
o the object is passed up to the UI tier
o some modifications are made to the object
o the object is passed back down to the business logic tier
o the application persists these modifications by calling update() in a
second session
Entidades y estados en detalle
•

saveOrUpdate() does the following:
o if the object is already persistent in this session, do nothing
o if another object associated with the session has the same identifier,
throw an exception
o if the object has no identifier property, save() it
o if the object's identifier has the value assigned to a newly instantiated
object, save() it
o if the object is versioned by a <version> or <timestamp>, and the version
property value is the same value assigned to a newly instantiated object,
save() it
o otherwise update() the object
Entidades y estados en detalle
Entidades y estados en detalle
•

•
•

Merge() is very different:
o if there is a persistent instance with the same identifier currently
associated with the session, copy the state of the given object onto the
persistent instance
o if there is no persistent instance currently associated with the session, try
to load it from the database, or create a new persistent instance
the persistent instance is returned
the given instance does not become associated with the session, it remains
detached
Entidades y estados en detalle
•
•

Otra forma de evitar estos problemas:
o LazyInitializationException
o An instance with...
y que no haya nunca entidades detached...
o es hacer conversaciones, la sesión está abierta siempre.
Patrones
Entidades y estados en detalle
•

Patrones de transacciones:
o Sesión por operación: ANTI PATRÓN.
o Sesión por request: la más habitual.
o Conversaciones
 Versioning
 Unión de objetos detached
Entidades y estados en detalle
•

Típico flujo de Hibernate con un patrón de request
Entidades y estados en detalle
•

Flujo de Hibernate con un patrón conversación
Entidades y estados en detalle
•
•

En conversación tendremos VARIAS transacciones (en cada carga de pantalla,
vista...), mientras no guardemos nada no hay problema.
Para no guardar nada intermedio:
o Podemos controlar manualmente cuando se hace un flush del contexto
de la Sesión con session.setFlushMode
o Hacemos un flush al final de todo y ya.
Entidades y estados en detalle
•

Problema:
o persist(): it does not guarantee that the identifier value will be assigned
to the persistent instance immediately, the assignment might happen at
flush time. persist() also guarantees that it will not execute an INSERT
statement if it is called outside of transaction boundaries.
o save() does guarantee to return an identifier. If an INSERT has to be
executed to get the identifier ( e.g. "identity" generator, not "sequence"),
this INSERT happens immediately, no matter if you are inside or outside
of a transaction.
Entidades y estados en detalle
•

El problema sólo ocurre en MySQL/SQL Server si uso save...
o es un problema fácilmente mitigable :)
Entidades y estados en detalle
Entidades y estados en detalle
•
•

¿Qué pasa con un flush en medio de una transaccion y luego hago un
rollback?
o setFlushMode(FlushMode.MANUAL)
o session.flush()
o Probadlo!
Y si hago:
o cambio
o flush()
o cambio
o flush()
o rollback()
Entidades y estados en detalle
•

De las dos formas los cambios no son persistidos.

•

Las transacciones deciden si algo se guarda o no.

•

Session.flush() decide QUÉ va a la base de datos.

•

En el segundo caso (varios flush()) se envían varios updates a la BD (varias
sincronizaciones).
Entidades y estados en detalle
•

Conclusiones:
o Con request puro
 Tened cuidado con LazyInitiali... (precargas)
 Cuidado con asociar la misma entidad... (típicamente no hacer
consultas y hacer update al final)
o Con OpenSessionInView (sesión abierta en vista)
 Cuidado con asociar la misma entidad.
o Con Conversaciones
 Sin problemas. Hacer un flush al final y ya.
Entidades y estados en detalle
•
•

•

"By default, the persistence context is flushed (synchronized with the
database) at the end of each transaction."
"As the result of a truly stupid and shortsighted decision by certain nonJBoss, non-Sun and non-Sybase members of the EJB 3.0 expert group, there
is currently no simple, usable and portable way to implement atomic
conversations using EJB 3.0 persistence. However, Hibernate provides this
feature as a vendor extension to the FlushModeTypes defined by the
specification, and it is our expectation that other vendors will soon provide a
similar extension."
Flush mode manual.
Queries
Queries
•
•
•
•

HQL
Criteria Hibernate
Criteria JPA
SQL
Criteria Hibernate
Criteria Hibernate
•

API clásica de Hibernate (3<)...

•

No está deprecated pero sin desarrollo activo.

•

No es type safe.

•

Trabaja en base a objetos de tipo Criteria.
Criteria Hibernate
•

La sintaxis es:
o session.createCriteria(___.class).list();
o Probad!
Criteria Hibernate
•

El criterio básico de comparación es un objeto de tipo Restrictions:
o Criteria criteria = session.createCriteria(___.class)
o criteria.add(Restrictions.eq("nombre_de_la_propiedad", valor));
o criteria.list();

•

Probadlo!
Criteria Hibernate
•

Muchos tipos de restrictions:
o equal
o notEqual
o gt
o ge
o lt
o le
o between
o like
o in
Criteria Hibernate
•

Intentad hacer una comparación que se traslade a algo como:
o select * from tabla where upper(nombre) like "%algo%"
 ilike (MatchMode.)

•

Method Chaining

•

if (quieroBuscarPorAlgo) then { criteria.add() }...
Criteria Hibernate
•
•

createAlias("solicitudes","solicitud")
Restrictions.eq("solicitud.nombre","LO_QUE_SEA");
o Probadlo! (es el cruce más importante)

•

Alias por defecto de la tabla raíz: {alias}

•

Disjunction

•

addOrder
Criteria Hibernate
Disjunction disjunction = Restrictions.disjunction();
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(2 = 1);
conjunction.add(3 = 2);
disjunction.add(conjunction);
disjunction.add(Restrictions.eqOrIsNull(propertyName, value))
criteria.add(disjunction);
// where (2=1 and 3=2) or (eqOrIsNull)
Criteria Hibernate
•

Comparaciones más complicadas:
o sqlRestrictions()
o Subqueries
o Query by example (criteria.add(Example.create(exampleObject)))
 Probadlo!
Criteria Hibernate
•

¿Qué consultas hacéis?
o Problemas con extensiones del lenguaje (recursividad)
o No tenemos insert/update masivo (en HQL sí)
Criteria JPA 2
Criteria JPA 2
•
•

TypeSafe
JPA (necesitas entityManager)

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Petition> query = builder.createQuery(Petition.class);
Root<Petition> petition = query.from(Petition.class);
query.select(petition);
TypedQuery<Petition> typedQuery = entityManager.createQuery(query);
List<Petition> petitions = typedQuery.getResultList();

•

Ejecutadlo!
Criteria JPA 2
•

Restricciones:
o query.where(builder.equal(petition.get("type"), "elemento"));
Criteria JPA 2
•

Metamodel
o Nos permite hacer restricciones sin cadenas.
o Hay que generarlo: 1, 2 y 3

EntityType<Petition> Petition_ = petition.getModel();
query.where(builder.equal(petition.get(Petition_.type), "elemento"));

•

Recordad:

query.where(builder.equal(petition.get("type"),
"elemento"));
Criteria JPA 2
•

Joins:
o Join<Petition, User> user = petition.join(Petition_.user);
HQL
HQL
•

Hibernate Query Language y Java Persistence Query Language (JPQL)
o Extensiones de SQL para trabajar con objetos, sintaxis abreviada.

o Non-type-safe (basado en cadenas)
o Case Insensitive (da igual las mayúsculas: sELEct)
HQL
•
•

El select más sencillo de HQL tiene esta forma:
o "from com.nhpatt.user.User" y recupera todos los elementos de la clase
User (todas las filas de la tabla = select * from User).
Tienen la forma:
[select_clause] from_clause
[where_clause]
[groupby_clause]
[having_clause]
[orderby_clause]
HQL
•
•

Probad un select sin más!
o session.createQuery("from User").list();
o session.createCriteria(User.class).list()
Tienen en cuenta las relaciones de herencia (varias actualizaciones o varias
eliminaciones)

•

Insert, update y delete

•

HQL (y el estándar no) tiene insert
HQL
•

Ejemplo de Update:

String hqlUpdate = "update Petition p set p.type = :newType where p.type
= :oldType";
int updatedEntities = session.createQuery(hqlUpdate)
.setString( "newType", newType )
.setString( "oldType", oldType )
.executeUpdate();
HQL
•

Ejemplo de Select con Joins:

select p
from Petition p
join p.user u
where u.name like '25'
HQL
•
•

Ignora las estrategias de anotaciones por defecto.
Left Join FETCH
o Estrategia Eager!
Native SQL Queries
Native SQL Queries
•
•

En cualquier momento podemos lanzar una consulta SQL directamente con:
o session.createSQLQuery("_consulta_").list();

Probadlo!, qué devuelve?
o ...
Native SQL Queries
•

Podemos especificar el tipo de los resultados, para que les convierta
explícitamente:
o session.createSQLQuery("_consulta_")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME", Hibernate.STRING)

•

Es útil, pero nos gustaría conversiones automáticas a entidades
Native SQL Queries
•

Hibernate puede convertir el resultado de una query SQL en una entidad
(incluso con asociaciones):
o session.createSQLQuery("_consulta_").addEntity();

•

Asociaciones (eager):

session.createSQLQuery("select * from user u, Petition p WHERE p.userId =
u.id")
.addEntity()
.addJoin();
Native SQL Queries
•

Asociaciones:

•

Es mejor hacer joins.

select {user.*},{role.*} from Usuario user, Role role
where user.role_id = role.id")
.addEntity("user", User.class)
.addEntity("role", Role.class)
Native SQL Queries
•

Hibernate puede transformar resultados de cosas que no son entidades:

sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))
Native SQL Queries
•

Se pueden utilizar parámetros:

query.setString(0, "");
query.setString("name", "");
"select * from tabla where columna = :name"

No se pueden reutilizar nombres, esto no vale:
"select * from tabla where columna = :name and columna2 = :name"

•

Named Queries
¿Dudas?
Hibernate / JPA @luce4

Más contenido relacionado

La actualidad más candente

Hibernate 3.2 short manual
Hibernate 3.2 short manualHibernate 3.2 short manual
Hibernate 3.2 short manual
Emmerson Miranda
 
Persistencia en Java - Serialización
Persistencia en Java - SerializaciónPersistencia en Java - Serialización
Persistencia en Java - Serialización
Carlos Hernando
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
Juan Ramón Laguardia
 
Elementos de una clase
Elementos de una claseElementos de una clase
Elementos de una clase
Isaias Toledo
 
Spring community day 2010
Spring community day 2010Spring community day 2010
Spring community day 2010
Jonathan Lara Vasquez
 
Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2
zaka3000
 
2.android java
2.android   java2.android   java
2.android java
guidotic
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
Angel Vázquez Patiño
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a Objetos
William Diaz S
 
Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)
universidad jose antonio paez
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
Danae Aguilar Guzmán
 
Introducción a la programación y la informática. Tema 4
Introducción a la programación y la informática. Tema 4Introducción a la programación y la informática. Tema 4
Introducción a la programación y la informática. Tema 4
Andres Garcia Garcia
 
Uml orientada a objetos
Uml orientada a objetosUml orientada a objetos
Uml orientada a objetos
ielectronicos
 
PERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOSPERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOS
Darwin Durand
 
Clases y Objetos
Clases y ObjetosClases y Objetos
Clases y Objetos
Xavier Ochoa
 
Uml diagrama claseobjeto
Uml diagrama claseobjetoUml diagrama claseobjeto
Uml diagrama claseobjeto
luisgustavosanchez
 

La actualidad más candente (16)

Hibernate 3.2 short manual
Hibernate 3.2 short manualHibernate 3.2 short manual
Hibernate 3.2 short manual
 
Persistencia en Java - Serialización
Persistencia en Java - SerializaciónPersistencia en Java - Serialización
Persistencia en Java - Serialización
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
 
Elementos de una clase
Elementos de una claseElementos de una clase
Elementos de una clase
 
Spring community day 2010
Spring community day 2010Spring community day 2010
Spring community day 2010
 
Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2
 
2.android java
2.android   java2.android   java
2.android java
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a Objetos
 
Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
 
Introducción a la programación y la informática. Tema 4
Introducción a la programación y la informática. Tema 4Introducción a la programación y la informática. Tema 4
Introducción a la programación y la informática. Tema 4
 
Uml orientada a objetos
Uml orientada a objetosUml orientada a objetos
Uml orientada a objetos
 
PERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOSPERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOS
 
Clases y Objetos
Clases y ObjetosClases y Objetos
Clases y Objetos
 
Uml diagrama claseobjeto
Uml diagrama claseobjetoUml diagrama claseobjeto
Uml diagrama claseobjeto
 

Similar a Hibernate - JPA @luce 4

Hibernate - JPA @luce
Hibernate - JPA @luceHibernate - JPA @luce
Hibernate - JPA @luce
Javier Gamarra
 
Capítulo 09 construcción de objetos
Capítulo 09 construcción de objetosCapítulo 09 construcción de objetos
Capítulo 09 construcción de objetos
Sergio Valenzuela Mayer
 
Hibernate - JPA @luce 2
Hibernate - JPA @luce 2Hibernate - JPA @luce 2
Hibernate - JPA @luce 2
Javier Gamarra
 
jsf
jsfjsf
Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programación
María Luisa Velasco
 
Sesion03 apuntes
Sesion03 apuntesSesion03 apuntes
Sesion03 apuntes
Thomas Santiago Gonzalez
 
Plone Gubierno Cuarto SesióN1
Plone Gubierno   Cuarto SesióN1Plone Gubierno   Cuarto SesióN1
Plone Gubierno Cuarto SesióN1
ajussis
 
Capítulo 08 extensión lógica con procesos
Capítulo 08 extensión lógica con procesosCapítulo 08 extensión lógica con procesos
Capítulo 08 extensión lógica con procesos
Sergio Valenzuela Mayer
 
Manual hibernate
Manual hibernateManual hibernate
Manual hibernate
shimbosan17
 
Joomla Entity - API semántica para Joomla
Joomla Entity - API semántica para JoomlaJoomla Entity - API semántica para Joomla
Joomla Entity - API semántica para Joomla
Roberto Segura
 
Capítulo 04 objetos fijos
Capítulo 04 objetos fijosCapítulo 04 objetos fijos
Capítulo 04 objetos fijos
Sergio Valenzuela Mayer
 
Hibernate
HibernateHibernate
Hibernate
Priscila Pacheco
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
Iker Canarias
 
Capítulo 03 ambiente trabajo simio
Capítulo 03 ambiente trabajo simioCapítulo 03 ambiente trabajo simio
Capítulo 03 ambiente trabajo simio
Sergio Valenzuela Mayer
 
Java server pages (jsp)
Java server pages (jsp)Java server pages (jsp)
Java server pages (jsp)
Nicolas Duran Rodriguez
 
Desarrollo Componentes J2EE
Desarrollo Componentes J2EEDesarrollo Componentes J2EE
Desarrollo Componentes J2EE
Lenin Lozano
 
Objetos Implicitos
Objetos ImplicitosObjetos Implicitos
Objetos Implicitos
Nicolas Duran Rodriguez
 
Procesos e Hilos en los Sistemas Operativos
Procesos e Hilos en los Sistemas OperativosProcesos e Hilos en los Sistemas Operativos
Procesos e Hilos en los Sistemas Operativos
Emmanuel Fortuna
 
Reglas de Código Simple
Reglas de Código SimpleReglas de Código Simple
Reglas de Código Simple
psluaces
 
Computacion distribuida usando Celery para Python
Computacion distribuida usando Celery para PythonComputacion distribuida usando Celery para Python
Computacion distribuida usando Celery para Python
Sebastián Ramírez Montaño
 

Similar a Hibernate - JPA @luce 4 (20)

Hibernate - JPA @luce
Hibernate - JPA @luceHibernate - JPA @luce
Hibernate - JPA @luce
 
Capítulo 09 construcción de objetos
Capítulo 09 construcción de objetosCapítulo 09 construcción de objetos
Capítulo 09 construcción de objetos
 
Hibernate - JPA @luce 2
Hibernate - JPA @luce 2Hibernate - JPA @luce 2
Hibernate - JPA @luce 2
 
jsf
jsfjsf
jsf
 
Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programación
 
Sesion03 apuntes
Sesion03 apuntesSesion03 apuntes
Sesion03 apuntes
 
Plone Gubierno Cuarto SesióN1
Plone Gubierno   Cuarto SesióN1Plone Gubierno   Cuarto SesióN1
Plone Gubierno Cuarto SesióN1
 
Capítulo 08 extensión lógica con procesos
Capítulo 08 extensión lógica con procesosCapítulo 08 extensión lógica con procesos
Capítulo 08 extensión lógica con procesos
 
Manual hibernate
Manual hibernateManual hibernate
Manual hibernate
 
Joomla Entity - API semántica para Joomla
Joomla Entity - API semántica para JoomlaJoomla Entity - API semántica para Joomla
Joomla Entity - API semántica para Joomla
 
Capítulo 04 objetos fijos
Capítulo 04 objetos fijosCapítulo 04 objetos fijos
Capítulo 04 objetos fijos
 
Hibernate
HibernateHibernate
Hibernate
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
 
Capítulo 03 ambiente trabajo simio
Capítulo 03 ambiente trabajo simioCapítulo 03 ambiente trabajo simio
Capítulo 03 ambiente trabajo simio
 
Java server pages (jsp)
Java server pages (jsp)Java server pages (jsp)
Java server pages (jsp)
 
Desarrollo Componentes J2EE
Desarrollo Componentes J2EEDesarrollo Componentes J2EE
Desarrollo Componentes J2EE
 
Objetos Implicitos
Objetos ImplicitosObjetos Implicitos
Objetos Implicitos
 
Procesos e Hilos en los Sistemas Operativos
Procesos e Hilos en los Sistemas OperativosProcesos e Hilos en los Sistemas Operativos
Procesos e Hilos en los Sistemas Operativos
 
Reglas de Código Simple
Reglas de Código SimpleReglas de Código Simple
Reglas de Código Simple
 
Computacion distribuida usando Celery para Python
Computacion distribuida usando Celery para PythonComputacion distribuida usando Celery para Python
Computacion distribuida usando Celery para Python
 

Más de Javier Gamarra

Performance myths in android
Performance myths in androidPerformance myths in android
Performance myths in android
Javier Gamarra
 
RxJava in practice
RxJava in practice RxJava in practice
RxJava in practice
Javier Gamarra
 
Cambiar una empresa con juegos ágiles
Cambiar una empresa con juegos ágilesCambiar una empresa con juegos ágiles
Cambiar una empresa con juegos ágiles
Javier Gamarra
 
New Android Languages
New Android LanguagesNew Android Languages
New Android Languages
Javier Gamarra
 
5 meses de juegos ágiles
5 meses de juegos ágiles5 meses de juegos ágiles
5 meses de juegos ágiles
Javier Gamarra
 
Opinionated android
Opinionated androidOpinionated android
Opinionated android
Javier Gamarra
 
Arduino - Cuarta sesión
Arduino - Cuarta sesiónArduino - Cuarta sesión
Arduino - Cuarta sesión
Javier Gamarra
 
Arduino - Tercera sesión
Arduino - Tercera sesiónArduino - Tercera sesión
Arduino - Tercera sesión
Javier Gamarra
 
Hibernate - JPA @luce 3
Hibernate - JPA @luce 3Hibernate - JPA @luce 3
Hibernate - JPA @luce 3
Javier Gamarra
 
Codemotion 2013
Codemotion 2013Codemotion 2013
Codemotion 2013
Javier Gamarra
 
CAS 2013
CAS 2013CAS 2013
CAS 2013
Javier Gamarra
 

Más de Javier Gamarra (11)

Performance myths in android
Performance myths in androidPerformance myths in android
Performance myths in android
 
RxJava in practice
RxJava in practice RxJava in practice
RxJava in practice
 
Cambiar una empresa con juegos ágiles
Cambiar una empresa con juegos ágilesCambiar una empresa con juegos ágiles
Cambiar una empresa con juegos ágiles
 
New Android Languages
New Android LanguagesNew Android Languages
New Android Languages
 
5 meses de juegos ágiles
5 meses de juegos ágiles5 meses de juegos ágiles
5 meses de juegos ágiles
 
Opinionated android
Opinionated androidOpinionated android
Opinionated android
 
Arduino - Cuarta sesión
Arduino - Cuarta sesiónArduino - Cuarta sesión
Arduino - Cuarta sesión
 
Arduino - Tercera sesión
Arduino - Tercera sesiónArduino - Tercera sesión
Arduino - Tercera sesión
 
Hibernate - JPA @luce 3
Hibernate - JPA @luce 3Hibernate - JPA @luce 3
Hibernate - JPA @luce 3
 
Codemotion 2013
Codemotion 2013Codemotion 2013
Codemotion 2013
 
CAS 2013
CAS 2013CAS 2013
CAS 2013
 

Último

Flows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos FeaturesFlows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos Features
Paola De la Torre
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
AMADO SALVADOR
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
al050121024
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
YaniEscobar2
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
mantenimientocarbra6
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
larapalaciosmonzon28
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
codesiret
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
leia ereni
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
MiguelAtencio10
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
larapalaciosmonzon28
 
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
AngelCristhianMB
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
Manuel Diaz
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
YashiraPaye
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
Festibity
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
doctorsoluciones34
 
Refrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y ForzadoRefrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y Forzado
NicandroMartinez2
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
AMADO SALVADOR
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
cecypozos703
 
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdfProjecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Festibity
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Festibity
 

Último (20)

Flows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos FeaturesFlows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos Features
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
 
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
 
Refrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y ForzadoRefrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y Forzado
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
 
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdfProjecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
 

Hibernate - JPA @luce 4

  • 2. ¿Qué deberíamos saber? • Relaciones simples @OneToMany y @ManyToOne • Cascades • Tipos de fetching
  • 3. ¿Qué vamos a ver? • Dudas? • El código está en github.
  • 4. ¿Qué vamos a ver? • Consultas • Entender la sesión...
  • 5. Entidades y estados en detalle
  • 6. Entidades y estados en detalle
  • 7. Entidades y estados en detalle
  • 8. Entidades y estados en detalle • La sesión (y entityManager) hace varias cosas: o Dirty Checking -> sólo actualizar las cosas que han cambiado. o Actúa de caché de primer nivel -> sólo lee si no lo tiene en sesión o Puede asegurar identidad de objetos o Puede extender la conversación
  • 9. Entidades y estados en detalle
  • 10. Entidades y estados en detalle
  • 12. Entidades y estados en detalle • Para ver el estado Persistent... o Cread un objeto (Pepe) o Guardad (Pepe) o Cambiad un valor del objeto (Lola) y no llamo a save/persist/update... o Haced un commit o En otra sesión o en la BD, leed el valor. Qué pasa? Se persiste el valor
  • 13. Entidades y estados en detalle • • • • Yo personalmente habría esperado leer Pepe. No llamamos a update explícitamente Hay 1 transacción de base de datos Cuando hacemos un save() y un rollback() no recupera el estado del objeto en Java (obviamente) o get() -> recupero Pepe o cambio a Lola o rollback() -> en BD sigue Pepe o mi modelo Java sigue poniendo Lola
  • 14. Entidades y estados en detalle • Para ver el estado Persistent tras un get/load o Recuperad un objeto de BD o Cambiad un valor del objeto o Haced un commit Qué pasa? -> Sí ha cambiado el valor.
  • 15. Entidades y estados en detalle • • • Esta política se llama write-behind. Implica que las entidades en estado PERSISTENT porque o o se ha llamado save/update/persist... dentro de una sesión... o o se han recuperado de base de datos con un get/load... guardan los cambios hechos hasta que se hace un commit(); • • Problemas? Dudas?
  • 16. Entidades y estados en detalle • • Haced el mismo ejercicio que antes, pero cuando recuperéis la sesión llamad a: o session.setFlushMode(FlushMode.Manual); Lo que inserta NO es la transacción es que POR DEFECTO (FlushMode.AUTO), Hibernate hace un flush cuando haces un commit();
  • 17. Entidades y estados en detalle • Si una entidad está en estado Persistent y hacemos un flush(), los cambios van a la BD
  • 19. Entidades y estados en detalle • • Probadlo! o Abrid una sesión, buscad un objeto, cerrad la sesión o Modificad el objeto o Abrid la sesión, buscadlo de nuevo... Ahora tenemos 2 objetos diferentes (en Java) apuntando a la misma fila de la BD...
  • 20. Entidades y estados en detalle • Problemas con entidades detached e identidad: o Abrid una sesión, buscad un objeto, cerrad la sesión o Modificad el objeto o Abrid la sesión, buscadlo de nuevo... o Guardad el primer objeto (el que ha sido modificado) con un update -> ERROR! • Si hago un update() ANTES de buscar... o Todo funciona correctamente, update sincroniza el estado a persistent en vez de detached.
  • 21. Entidades y estados en detalle • Este caso es poco habitual pero no tan raro cómo parece: o Típicamente no harás una consulta del elemento directamente y luego un update(). o Pero sí que es más habitual que ALGO haga una consulta que recupere un elemento detached (típicamente una asociación con Eager, una precarga...)
  • 22. Entidades y estados en detalle • Puedo pasar de detached a persistent de cuatro formas: o session.update() / session.saveOrUpdate() o session.merge (me crea un objeto "sincronizado")  Probadlo! load(1), cerrando sesión modificando load(1), merge(), update()/saveOrUpdate() o session.evict() (sacar de la sesión el objeto que acabo de recuperar) o session.lock() (igual que el merge si sé con seguridad que no he tocado el objeto) • • •
  • 23. Entidades y estados en detalle • Usually update() or saveOrUpdate() are used in the following scenario: o the application loads an object in the first session o the object is passed up to the UI tier o some modifications are made to the object o the object is passed back down to the business logic tier o the application persists these modifications by calling update() in a second session
  • 24. Entidades y estados en detalle • saveOrUpdate() does the following: o if the object is already persistent in this session, do nothing o if another object associated with the session has the same identifier, throw an exception o if the object has no identifier property, save() it o if the object's identifier has the value assigned to a newly instantiated object, save() it o if the object is versioned by a <version> or <timestamp>, and the version property value is the same value assigned to a newly instantiated object, save() it o otherwise update() the object
  • 25. Entidades y estados en detalle
  • 26. Entidades y estados en detalle • • • Merge() is very different: o if there is a persistent instance with the same identifier currently associated with the session, copy the state of the given object onto the persistent instance o if there is no persistent instance currently associated with the session, try to load it from the database, or create a new persistent instance the persistent instance is returned the given instance does not become associated with the session, it remains detached
  • 27. Entidades y estados en detalle • • Otra forma de evitar estos problemas: o LazyInitializationException o An instance with... y que no haya nunca entidades detached... o es hacer conversaciones, la sesión está abierta siempre.
  • 29. Entidades y estados en detalle • Patrones de transacciones: o Sesión por operación: ANTI PATRÓN. o Sesión por request: la más habitual. o Conversaciones  Versioning  Unión de objetos detached
  • 30. Entidades y estados en detalle • Típico flujo de Hibernate con un patrón de request
  • 31. Entidades y estados en detalle • Flujo de Hibernate con un patrón conversación
  • 32. Entidades y estados en detalle • • En conversación tendremos VARIAS transacciones (en cada carga de pantalla, vista...), mientras no guardemos nada no hay problema. Para no guardar nada intermedio: o Podemos controlar manualmente cuando se hace un flush del contexto de la Sesión con session.setFlushMode o Hacemos un flush al final de todo y ya.
  • 33. Entidades y estados en detalle • Problema: o persist(): it does not guarantee that the identifier value will be assigned to the persistent instance immediately, the assignment might happen at flush time. persist() also guarantees that it will not execute an INSERT statement if it is called outside of transaction boundaries. o save() does guarantee to return an identifier. If an INSERT has to be executed to get the identifier ( e.g. "identity" generator, not "sequence"), this INSERT happens immediately, no matter if you are inside or outside of a transaction.
  • 34. Entidades y estados en detalle • El problema sólo ocurre en MySQL/SQL Server si uso save... o es un problema fácilmente mitigable :)
  • 35. Entidades y estados en detalle
  • 36. Entidades y estados en detalle • • ¿Qué pasa con un flush en medio de una transaccion y luego hago un rollback? o setFlushMode(FlushMode.MANUAL) o session.flush() o Probadlo! Y si hago: o cambio o flush() o cambio o flush() o rollback()
  • 37. Entidades y estados en detalle • De las dos formas los cambios no son persistidos. • Las transacciones deciden si algo se guarda o no. • Session.flush() decide QUÉ va a la base de datos. • En el segundo caso (varios flush()) se envían varios updates a la BD (varias sincronizaciones).
  • 38. Entidades y estados en detalle • Conclusiones: o Con request puro  Tened cuidado con LazyInitiali... (precargas)  Cuidado con asociar la misma entidad... (típicamente no hacer consultas y hacer update al final) o Con OpenSessionInView (sesión abierta en vista)  Cuidado con asociar la misma entidad. o Con Conversaciones  Sin problemas. Hacer un flush al final y ya.
  • 39. Entidades y estados en detalle • • • "By default, the persistence context is flushed (synchronized with the database) at the end of each transaction." "As the result of a truly stupid and shortsighted decision by certain nonJBoss, non-Sun and non-Sybase members of the EJB 3.0 expert group, there is currently no simple, usable and portable way to implement atomic conversations using EJB 3.0 persistence. However, Hibernate provides this feature as a vendor extension to the FlushModeTypes defined by the specification, and it is our expectation that other vendors will soon provide a similar extension." Flush mode manual.
  • 43. Criteria Hibernate • API clásica de Hibernate (3<)... • No está deprecated pero sin desarrollo activo. • No es type safe. • Trabaja en base a objetos de tipo Criteria.
  • 44. Criteria Hibernate • La sintaxis es: o session.createCriteria(___.class).list(); o Probad!
  • 45. Criteria Hibernate • El criterio básico de comparación es un objeto de tipo Restrictions: o Criteria criteria = session.createCriteria(___.class) o criteria.add(Restrictions.eq("nombre_de_la_propiedad", valor)); o criteria.list(); • Probadlo!
  • 46. Criteria Hibernate • Muchos tipos de restrictions: o equal o notEqual o gt o ge o lt o le o between o like o in
  • 47. Criteria Hibernate • Intentad hacer una comparación que se traslade a algo como: o select * from tabla where upper(nombre) like "%algo%"  ilike (MatchMode.) • Method Chaining • if (quieroBuscarPorAlgo) then { criteria.add() }...
  • 48. Criteria Hibernate • • createAlias("solicitudes","solicitud") Restrictions.eq("solicitud.nombre","LO_QUE_SEA"); o Probadlo! (es el cruce más importante) • Alias por defecto de la tabla raíz: {alias} • Disjunction • addOrder
  • 49. Criteria Hibernate Disjunction disjunction = Restrictions.disjunction(); Conjunction conjunction = Restrictions.conjunction(); conjunction.add(2 = 1); conjunction.add(3 = 2); disjunction.add(conjunction); disjunction.add(Restrictions.eqOrIsNull(propertyName, value)) criteria.add(disjunction); // where (2=1 and 3=2) or (eqOrIsNull)
  • 50. Criteria Hibernate • Comparaciones más complicadas: o sqlRestrictions() o Subqueries o Query by example (criteria.add(Example.create(exampleObject)))  Probadlo!
  • 51. Criteria Hibernate • ¿Qué consultas hacéis? o Problemas con extensiones del lenguaje (recursividad) o No tenemos insert/update masivo (en HQL sí)
  • 53. Criteria JPA 2 • • TypeSafe JPA (necesitas entityManager) CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<Petition> query = builder.createQuery(Petition.class); Root<Petition> petition = query.from(Petition.class); query.select(petition); TypedQuery<Petition> typedQuery = entityManager.createQuery(query); List<Petition> petitions = typedQuery.getResultList(); • Ejecutadlo!
  • 54. Criteria JPA 2 • Restricciones: o query.where(builder.equal(petition.get("type"), "elemento"));
  • 55. Criteria JPA 2 • Metamodel o Nos permite hacer restricciones sin cadenas. o Hay que generarlo: 1, 2 y 3 EntityType<Petition> Petition_ = petition.getModel(); query.where(builder.equal(petition.get(Petition_.type), "elemento")); • Recordad: query.where(builder.equal(petition.get("type"), "elemento"));
  • 56. Criteria JPA 2 • Joins: o Join<Petition, User> user = petition.join(Petition_.user);
  • 57. HQL
  • 58. HQL • Hibernate Query Language y Java Persistence Query Language (JPQL) o Extensiones de SQL para trabajar con objetos, sintaxis abreviada. o Non-type-safe (basado en cadenas) o Case Insensitive (da igual las mayúsculas: sELEct)
  • 59. HQL • • El select más sencillo de HQL tiene esta forma: o "from com.nhpatt.user.User" y recupera todos los elementos de la clase User (todas las filas de la tabla = select * from User). Tienen la forma: [select_clause] from_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause]
  • 60. HQL • • Probad un select sin más! o session.createQuery("from User").list(); o session.createCriteria(User.class).list() Tienen en cuenta las relaciones de herencia (varias actualizaciones o varias eliminaciones) • Insert, update y delete • HQL (y el estándar no) tiene insert
  • 61. HQL • Ejemplo de Update: String hqlUpdate = "update Petition p set p.type = :newType where p.type = :oldType"; int updatedEntities = session.createQuery(hqlUpdate) .setString( "newType", newType ) .setString( "oldType", oldType ) .executeUpdate();
  • 62. HQL • Ejemplo de Select con Joins: select p from Petition p join p.user u where u.name like '25'
  • 63. HQL • • Ignora las estrategias de anotaciones por defecto. Left Join FETCH o Estrategia Eager!
  • 65. Native SQL Queries • • En cualquier momento podemos lanzar una consulta SQL directamente con: o session.createSQLQuery("_consulta_").list(); Probadlo!, qué devuelve? o ...
  • 66. Native SQL Queries • Podemos especificar el tipo de los resultados, para que les convierta explícitamente: o session.createSQLQuery("_consulta_") .addScalar("ID", Hibernate.LONG) .addScalar("NAME", Hibernate.STRING) • Es útil, pero nos gustaría conversiones automáticas a entidades
  • 67. Native SQL Queries • Hibernate puede convertir el resultado de una query SQL en una entidad (incluso con asociaciones): o session.createSQLQuery("_consulta_").addEntity(); • Asociaciones (eager): session.createSQLQuery("select * from user u, Petition p WHERE p.userId = u.id") .addEntity() .addJoin();
  • 68. Native SQL Queries • Asociaciones: • Es mejor hacer joins. select {user.*},{role.*} from Usuario user, Role role where user.role_id = role.id") .addEntity("user", User.class) .addEntity("role", Role.class)
  • 69. Native SQL Queries • Hibernate puede transformar resultados de cosas que no son entidades: sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") .setResultTransformer(Transformers.aliasToBean(CatDTO.class))
  • 70. Native SQL Queries • Se pueden utilizar parámetros: query.setString(0, ""); query.setString("name", ""); "select * from tabla where columna = :name" No se pueden reutilizar nombres, esto no vale: "select * from tabla where columna = :name and columna2 = :name" • Named Queries
  • 72. Hibernate / JPA @luce4