Vous êtes sur la page 1sur 24

Gestin de objetos

persistentes en JPA
Sistema de Persistencia de
Objetos

Ciclo de vida un objeto


persistente

nov-08

alb@uniovi.es

JVM

Control del ciclo de vida




Se gestiona desde un EntityManager




El EntityManager (la sesin) es el mbito de


persistencia



Es el gestor de persistencia de JPA

El ciclo de vida tiene lugar en la memoria de la JVM


Un objeto est
est en sesin
sesin cuando est en Persistent

La sesin es una cach de primer nivel que:




Garantiza la identidad java y la identidad DB




JPA (hibernate) optimiza el SQL para minimizar trfico a la


BBDD



nov-08

No habr varios objetos en sesin representando la misma fila

Dirty-checking
Write-behind
alb@uniovi.es

Dentro del contexto de


persistencia(EntityManager)



Se lleva a cabo una unidad de trabajo (UOK)


Al final de la unidad de trabajo se sincroniza con la
BBDD
La sesin lleva traza de todos los cambios hechos a
los objetos en memoria durante la unidad de trabajo
Al hacer COMMIT o FLUSH hibernate organiza las
actualizaciones para optimizar el rendimiento
La identidad se garantiza porque una fila de la BBDD
solo se carga una vez y es representada por un nico
objeto java por contexto de persistencia


nov-08

Pero puede haber muchos contextos simultneos


alb@uniovi.es

Estados de persistencia


Transient


Persistent



Un objeto enlazado con la sesin


Todos los cambios que se le hagan sern persistentes

Detached


Un objeto recin creado que no ha sido enlazado con el


gestor de persistencia (solo existe en memoria de la JVM)

Un objeto persistente que sigue en memoria despus de que


termina la sesin: existe en java y en la BDD

Removed


nov-08

Un objeto marcado para ser eliminado de la BBDD: existe en


java y se borrar de la BDD al terminar la sesin
alb@uniovi.es

nov-08

alb@uniovi.es

mbito de identidad garantizada


slo dentro del contexto

nov-08

alb@uniovi.es

Identidad fuera de la sesin

Siguiendo con el ejemplo


anterior:
Canto vale allObjects.size() ?
Set() depende de equals()  hay que
implementar equals() en todos los
objetos que se vayan a guardar en
colecciones para estar seguros de lo
que hacenov-08

alb@uniovi.es

Sincronizacin de la sesin y
la BBDD


Ocurre los ms tarde posible:






Cuando se hace COMMIT a una transaccin


Antes de que se ejecute una consulta
Cuando se llama entityManager.flush()

Se puede modificar el comportamiento




entityManager.setFlushMode()




nov-08

FlushMode.AUTO
FlushMode.COMMIT
FlushMode.MANUAL slo hibernate
alb@uniovi.es

API de EntityManager


Factora de Consultas y Transacciones

nov-08

alb@uniovi.es

10

APIs JPA

alb@uniovi.es

11

mbito de persistencia

Item todava persistente,


se salva aqu

nov-08

alb@uniovi.es

12

Gestionando objetos













Inicio de una unidad de trabajo


Fin de la unidad de trabajo
Hacer un objeto persistente
Cargar un objeto persistido
Modificar un objeto persistente
Hacer transient objeto persistente
Hacer detached todos los objetos del contexto
Hacer persistente un objeto detached
Hacer transient un detached
Merge con un objeto detached
Merge con un objeto detached: algoritmo JPA
Flush del contexto de persistencia

13

Gestionando objetos


Inicio de la unidad de trabajo

Fin de la unidad de trabajo

Gestin ms correcta de la
sesin y transaccin:
control de las excepciones
nov-08

alb@uniovi.es

14

Hacer objeto persistente

nov-08

alb@uniovi.es

15

Cargar objeto persistido

find() o getReference() ?
Si no existe en BDD:
find() devuelve null
getReference() devuelve un proxy
Que puede lanzar EntityNotFoundException
nov-08

alb@uniovi.es

16

Modificar objeto persistente

nov-08

alb@uniovi.es

17

Hacer transient objeto


persistente

nov-08

alb@uniovi.es

18

Hacer detached todos los


objetos del contexto

Item no se sincroniza al commit()

nov-08

alb@uniovi.es

19

Hacer persistente un objeto


detached

nov-08

alb@uniovi.es

20

Hacer transient un detached

Detached  no est en sesin pero s en BDD (y en JVM)


Transient  no est en sesin ni en BDD (pero s en JVM)

nov-08

alb@uniovi.es

21

Merge con un objeto detached


Devuelve un
objeto
nuevo

item no est en contexto


mergedItem s est
nov-08

alb@uniovi.es

22

Merge con un objeto


detached: algoritmo JPA


Si existe otro objeto persistente con


misma identidad BDD


Si existe en BDD


Copiar detached en persistente


cargar y actualizar datos con los del
detached

Si no esta en BDD


nov-08

Es objeto nuevo, se hace persistente


alb@uniovi.es

23

Flushing el contexto de
persistencia




Cuando EntityTransaction committed


Antes de ejecutar una query
Llamando a em.flush()

FlushMode.AUTO
Commit
Query
em.flush()
FlushMode.COMMIT
Commit
em.flush()

nov-08

alb@uniovi.es

24