SlideShare una empresa de Scribd logo
1 de 40
Descargar para leer sin conexión
Hibernate / JPA @luce3
¿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?
•

Propietarios de la relación

•

Entender la sesión...
Propietarios de la
relación
Propietarios
•
•

Relaciones unidireccionales:
o Un usuario tiene un rol, pero no al revés.
Relación bidireccional:
o Un usuario tiene un conjunto de solicitudes y cada solicitud tiene
asociado ese mismo usuario.
Propietarios
•

Propietario: es el responsable de la actualización/inserción de la relación.
o Ejemplo: una solicitud tiene asociado unos datos económicos. Cuando
inserto la solicitud quiero que se inserten sus datos económicos.
 El responsable de la relación es la solicitud.
o Sólo puede haber un responsable de una relación.
Propietarios
•
•

En las relaciones unidireccionales:
o El responsable es el lado que tiene el mapping (mapeo).
En las relaciones bidireccionales:
o HAY que especificar el responsable de la relación.
Propietarios
•

@OneToMany... hemos visto:
o Unidireccional
o Unidireccional con join table
o Bidireccional?
Propietarios
•

Bidireccional. Lado propietario en el @ManyToOne
o (recomendado!)
o De esta forma:
 Usuario: @OneToMany (mappedBy="usuarioEJEMPLO")
 Solicitud: @ManyToOne @JoinColumn("nombre de la columna")
private Usuario usuarioEJEMPLO;
Propietarios
•

Probadlo!
o La solicitud tiene un atributo Usuario con un @ManyToOne

o El usuario tiene una propiedad mappedBy dentro del @OneToMany que
apunta al NOMBRE del atributo usuario en la solicitud.
Propietarios
•

En el otro lado:
o Lado del One: JoinColumn con name="lo_que_sea", insertable = false,
updatable = false;
o Lado del Many: JoinColumn con name="lo_que_sea".

•

Probadlo!
o Usuario apuntando a una set de solicitudes con @OneToMany SIN
mappedBy
o Solicitud apuntando a un Usuario con @ManyToOne y propiedades
insertable=false, updatable=false (hay varios @JoinColumn pero uno no
es insertable).
Propietarios
•

¿Qué pegas véis?
o ...
Propietarios
•
•

Ligeramente más ineficiente, ojo con Envers (auditoría)
o Insert y luego un update (por PK).
La foreign key no puede tener NOT NULL.
Propietarios
•
•

Sólo, sólo, sólo puede haber un sitio en el que se mapean físicamente las
columnas para ser insertadas (sólo un @JoinColumn con insertable=true,
updatable=true)
Por favor, haced las operaciones en los dos lados.
o Si añado una solicitud a un usuario, también llamo a el setUsuario de
solicitud.
o Si llamo a setUsuario de solicitud también añado la solicitud a la lista de
solicitudes de usuario.
Propietarios
•
•
•

Poner mal el propietario de la relación introduce errores sutiles...
He creado un ejemplo para verlo con Historial, que tiene una lista de
expedientes y Expediente que tiene un Historial.
El responsable debería ser Historial, pero nos hemos colado...
Propietarios
•

Regla de Oro para relaciones bidireccionales en relación padre-hijos:
o Si la entidad importante es el padre -> insertable = false, updatable =
false en el HIJO
o Si la entidad importante es el hijo -> mappedBy en el PADRE
Listas
Listas
•
•

Sets? y listas?
Una lista tiene ORDEN, si no tiene orden es un "Bag"
o Un conjunto de elementos sin orden/sin indexar
o Elementos repetidos: viola el principio de unicidad de tuplas del modelo
relacional
o Cannot simultaneously fetch multiple bags -> sólo se puede recuperar a
Eager una sola bag.
o Envers no lo soporta.
Listas
•
•
•

S1 Euro
S1 Euro
S1 Paseo Zorrilla

S1 -> 3 direcciones (Euro, Euro, Paseo Zorrilla) 1 única bolsa
S1
S1
S1

1 Euro
2 Euro
P Zorrilla

Portal 1
Portal 2
Portal 3
Listas
•
•
•

Y funciona? Poner un List?
o Sí. Pero no lo hagáis si podéis evitarlo.
Si tenemos orden, lo mapeamos con @OrderColumn (hibernate no te crea la
columna automáticamente)
Si no tenemos orden, mapeamos un Set.
o Si necesitamos una lista, creamos un método que devuelva una lista a
partir del Set.
o Las operaciones de persistencia las hacemos sobre el Set.
Listas
•

Caso de prueba:
o Mapead una relación bidireccional entre solicitud y datos bancarios
(pueden ser varios para una solicitud) (me da igual que propietario
mientras lo entendais).
o Guardad varios datos bancarios.
Listas
•
•
•

Hibernate comprueba si las colecciones han cambiado, por identidad de Java
(el resto de cosas por valor).
Le obliga a guardar toda la colección, no sabe que no han cambiado los
componentes.
Llamad a add(), addAll() y remove() cuando queráis interaccionar con
elementos de una lista.
Listas
•

No hagáis estas cosas (con names anotado):

public void setNames(List namesList) {
names = (String[]) namesList.toArray();
}
public List getNames() {
return Arrays.asList(names);
}
Listas
•

O no hagáis esto para incluir nuevos elementos o borrar:

names = NUEVA LISTA
Relaciones avanzadas
Relaciones avanzadas
•
•
•

ManyToMany
o Unidireccional
o Bidireccional: mappedBy
Excesivamente compleja, mejor evitarla o mapearla como dos relaciones
(@OneToMany y @ManyToOne).
Si no existen las tablas, mejor, porque genera el esquema correcto.
Relaciones avanzadas
•
•

La relación consiste en un nombre específico para la tabla de unión:
o joinTable (name)
y los nombres de las columnas de unión:
o joinColumns e inverseJoinColumns.
Relaciones avanzadas
•

@CollectionOfElements, una lista de valores simpres
o @ElementCollection
o @CollectionTable(name="___", joinColumns=@JoinColumn(name="__"))
Relaciones avanzadas
•
•

@OneToOne
o foreign key o tabla
o compartiendo primary key
Mapas
o @MapKey(name="number")
Relaciones avanzadas
•

Las relaciones es la parte más complicada (IMHO) de Hibernate:
o Tirar de referencia
Más mapeos
Más mapeos de columnas
•
•

@Formula
o Para incluir SQL directamente en un mapeo.
o También subselects
o Pruebalo!
@Temporal(...)
o Para mapear el caos de tipos de fechas diferentes dependiendo de la BD.
o Pruebalo!
Más mapeos de columnas
•
•
•

@Enumerated
o Para mapear una enumeración
@Sort/@Where
o Ordenación y restricciones por defecto!
@Lob
o Para mapear un lob/clob...
Tipos
Tipos
•

Detrás de los mapeos hay tipos de Hibernate:
o Valores (org.hibernate.type.StringType)
o Compuestos (les veremos mañana...)
o Colecciones
o Custom (los que yo defina)
FAQ
FAQ
•
•

...
¿Dudas?
Hibernate / JPA

Más contenido relacionado

Destacado

Destacado (20)

CAS 2013
CAS 2013CAS 2013
CAS 2013
 
Hibernate - JPA @luce 5
Hibernate - JPA @luce 5Hibernate - JPA @luce 5
Hibernate - JPA @luce 5
 
Problemas Propuestos Condicionales Compuestos
Problemas Propuestos Condicionales CompuestosProblemas Propuestos Condicionales Compuestos
Problemas Propuestos Condicionales Compuestos
 
Opinionated android
Opinionated androidOpinionated android
Opinionated android
 
Taller de Arduino en Cylicon Valley - Semana 2
Taller de Arduino en Cylicon Valley - Semana 2Taller de Arduino en Cylicon Valley - Semana 2
Taller de Arduino en Cylicon Valley - Semana 2
 
Curso Arduino Nivel 3: Mueve cosas con Arduino. Tenerife Maker Space
Curso Arduino Nivel 3: Mueve cosas con Arduino. Tenerife Maker SpaceCurso Arduino Nivel 3: Mueve cosas con Arduino. Tenerife Maker Space
Curso Arduino Nivel 3: Mueve cosas con Arduino. Tenerife Maker Space
 
Modos de servicio_para_tv_chinos (1)
Modos de servicio_para_tv_chinos (1)Modos de servicio_para_tv_chinos (1)
Modos de servicio_para_tv_chinos (1)
 
Arduino - Tercera sesión
Arduino - Tercera sesiónArduino - Tercera sesión
Arduino - Tercera sesión
 
5 meses de juegos ágiles
5 meses de juegos ágiles5 meses de juegos ágiles
5 meses de juegos ágiles
 
Performance myths in android
Performance myths in androidPerformance myths in android
Performance myths in android
 
Taller de Arduino básico. Tenerife Maker Space. Nivel 2
Taller de Arduino básico. Tenerife Maker Space. Nivel 2Taller de Arduino básico. Tenerife Maker Space. Nivel 2
Taller de Arduino básico. Tenerife Maker Space. Nivel 2
 
RxJava in practice
RxJava in practice RxJava in practice
RxJava in practice
 
Actividades de-lectoescritura-05
Actividades de-lectoescritura-05Actividades de-lectoescritura-05
Actividades de-lectoescritura-05
 
Introducción a Arduino (TLP2014)
Introducción a Arduino (TLP2014)Introducción a Arduino (TLP2014)
Introducción a Arduino (TLP2014)
 
BlueWeekend iOT
BlueWeekend iOTBlueWeekend iOT
BlueWeekend iOT
 
Introducción a Arduino. Tenerife Maker Space. Nivel 1
Introducción a Arduino. Tenerife Maker Space. Nivel 1Introducción a Arduino. Tenerife Maker Space. Nivel 1
Introducción a Arduino. Tenerife Maker Space. Nivel 1
 
Cuestionario, checklist, inspecccion, entrevista
Cuestionario, checklist, inspecccion, entrevistaCuestionario, checklist, inspecccion, entrevista
Cuestionario, checklist, inspecccion, entrevista
 
Cambiar una empresa con juegos ágiles
Cambiar una empresa con juegos ágilesCambiar una empresa con juegos ágiles
Cambiar una empresa con juegos ágiles
 
Tema2.componenteselectrónicos%28 alumnos%29
Tema2.componenteselectrónicos%28 alumnos%29Tema2.componenteselectrónicos%28 alumnos%29
Tema2.componenteselectrónicos%28 alumnos%29
 
Bachillerato Internacional, formación para líderes del futuro
Bachillerato Internacional, formación para líderes del futuroBachillerato Internacional, formación para líderes del futuro
Bachillerato Internacional, formación para líderes del futuro
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (11)

Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 

Hibernate - JPA @luce 3

  • 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? • Propietarios de la relación • Entender la sesión...
  • 6. Propietarios • • Relaciones unidireccionales: o Un usuario tiene un rol, pero no al revés. Relación bidireccional: o Un usuario tiene un conjunto de solicitudes y cada solicitud tiene asociado ese mismo usuario.
  • 7. Propietarios • Propietario: es el responsable de la actualización/inserción de la relación. o Ejemplo: una solicitud tiene asociado unos datos económicos. Cuando inserto la solicitud quiero que se inserten sus datos económicos.  El responsable de la relación es la solicitud. o Sólo puede haber un responsable de una relación.
  • 8. Propietarios • • En las relaciones unidireccionales: o El responsable es el lado que tiene el mapping (mapeo). En las relaciones bidireccionales: o HAY que especificar el responsable de la relación.
  • 9. Propietarios • @OneToMany... hemos visto: o Unidireccional o Unidireccional con join table o Bidireccional?
  • 10. Propietarios • Bidireccional. Lado propietario en el @ManyToOne o (recomendado!) o De esta forma:  Usuario: @OneToMany (mappedBy="usuarioEJEMPLO")  Solicitud: @ManyToOne @JoinColumn("nombre de la columna") private Usuario usuarioEJEMPLO;
  • 11. Propietarios • Probadlo! o La solicitud tiene un atributo Usuario con un @ManyToOne o El usuario tiene una propiedad mappedBy dentro del @OneToMany que apunta al NOMBRE del atributo usuario en la solicitud.
  • 12. Propietarios • En el otro lado: o Lado del One: JoinColumn con name="lo_que_sea", insertable = false, updatable = false; o Lado del Many: JoinColumn con name="lo_que_sea". • Probadlo! o Usuario apuntando a una set de solicitudes con @OneToMany SIN mappedBy o Solicitud apuntando a un Usuario con @ManyToOne y propiedades insertable=false, updatable=false (hay varios @JoinColumn pero uno no es insertable).
  • 14. Propietarios • • Ligeramente más ineficiente, ojo con Envers (auditoría) o Insert y luego un update (por PK). La foreign key no puede tener NOT NULL.
  • 15. Propietarios • • Sólo, sólo, sólo puede haber un sitio en el que se mapean físicamente las columnas para ser insertadas (sólo un @JoinColumn con insertable=true, updatable=true) Por favor, haced las operaciones en los dos lados. o Si añado una solicitud a un usuario, también llamo a el setUsuario de solicitud. o Si llamo a setUsuario de solicitud también añado la solicitud a la lista de solicitudes de usuario.
  • 16. Propietarios • • • Poner mal el propietario de la relación introduce errores sutiles... He creado un ejemplo para verlo con Historial, que tiene una lista de expedientes y Expediente que tiene un Historial. El responsable debería ser Historial, pero nos hemos colado...
  • 17. Propietarios • Regla de Oro para relaciones bidireccionales en relación padre-hijos: o Si la entidad importante es el padre -> insertable = false, updatable = false en el HIJO o Si la entidad importante es el hijo -> mappedBy en el PADRE
  • 19. Listas • • Sets? y listas? Una lista tiene ORDEN, si no tiene orden es un "Bag" o Un conjunto de elementos sin orden/sin indexar o Elementos repetidos: viola el principio de unicidad de tuplas del modelo relacional o Cannot simultaneously fetch multiple bags -> sólo se puede recuperar a Eager una sola bag. o Envers no lo soporta.
  • 20. Listas • • • S1 Euro S1 Euro S1 Paseo Zorrilla S1 -> 3 direcciones (Euro, Euro, Paseo Zorrilla) 1 única bolsa S1 S1 S1 1 Euro 2 Euro P Zorrilla Portal 1 Portal 2 Portal 3
  • 21. Listas • • • Y funciona? Poner un List? o Sí. Pero no lo hagáis si podéis evitarlo. Si tenemos orden, lo mapeamos con @OrderColumn (hibernate no te crea la columna automáticamente) Si no tenemos orden, mapeamos un Set. o Si necesitamos una lista, creamos un método que devuelva una lista a partir del Set. o Las operaciones de persistencia las hacemos sobre el Set.
  • 22. Listas • Caso de prueba: o Mapead una relación bidireccional entre solicitud y datos bancarios (pueden ser varios para una solicitud) (me da igual que propietario mientras lo entendais). o Guardad varios datos bancarios.
  • 23. Listas • • • Hibernate comprueba si las colecciones han cambiado, por identidad de Java (el resto de cosas por valor). Le obliga a guardar toda la colección, no sabe que no han cambiado los componentes. Llamad a add(), addAll() y remove() cuando queráis interaccionar con elementos de una lista.
  • 24. Listas • No hagáis estas cosas (con names anotado): public void setNames(List namesList) { names = (String[]) namesList.toArray(); } public List getNames() { return Arrays.asList(names); }
  • 25. Listas • O no hagáis esto para incluir nuevos elementos o borrar: names = NUEVA LISTA
  • 27. Relaciones avanzadas • • • ManyToMany o Unidireccional o Bidireccional: mappedBy Excesivamente compleja, mejor evitarla o mapearla como dos relaciones (@OneToMany y @ManyToOne). Si no existen las tablas, mejor, porque genera el esquema correcto.
  • 28. Relaciones avanzadas • • La relación consiste en un nombre específico para la tabla de unión: o joinTable (name) y los nombres de las columnas de unión: o joinColumns e inverseJoinColumns.
  • 29. Relaciones avanzadas • @CollectionOfElements, una lista de valores simpres o @ElementCollection o @CollectionTable(name="___", joinColumns=@JoinColumn(name="__"))
  • 30. Relaciones avanzadas • • @OneToOne o foreign key o tabla o compartiendo primary key Mapas o @MapKey(name="number")
  • 31. Relaciones avanzadas • Las relaciones es la parte más complicada (IMHO) de Hibernate: o Tirar de referencia
  • 33. Más mapeos de columnas • • @Formula o Para incluir SQL directamente en un mapeo. o También subselects o Pruebalo! @Temporal(...) o Para mapear el caos de tipos de fechas diferentes dependiendo de la BD. o Pruebalo!
  • 34. Más mapeos de columnas • • • @Enumerated o Para mapear una enumeración @Sort/@Where o Ordenación y restricciones por defecto! @Lob o Para mapear un lob/clob...
  • 35. Tipos
  • 36. Tipos • Detrás de los mapeos hay tipos de Hibernate: o Valores (org.hibernate.type.StringType) o Compuestos (les veremos mañana...) o Colecciones o Custom (los que yo defina)
  • 37. FAQ