Hibernate - JPA @luce 3

589 views

Published on

Third day of the Hibernate course, about bags, owner in oneToMany or manyToOne relations...

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
589
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
15
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Hibernate - JPA @luce 3

  1. 1. Hibernate / JPA @luce3
  2. 2. ¿Qué deberíamos saber? • Relaciones simples @OneToMany y @ManyToOne • Cascades • Tipos de fetching
  3. 3. ¿Qué vamos a ver? • Dudas? • El código está en github.
  4. 4. ¿Qué vamos a ver? • Propietarios de la relación • Entender la sesión...
  5. 5. Propietarios de la relación
  6. 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. 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. 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. 9. Propietarios • @OneToMany... hemos visto: o Unidireccional o Unidireccional con join table o Bidireccional?
  10. 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. 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. 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).
  13. 13. Propietarios • ¿Qué pegas véis? o ...
  14. 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. 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. 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. 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
  18. 18. Listas
  19. 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. 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. 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. 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. 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. 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. 25. Listas • O no hagáis esto para incluir nuevos elementos o borrar: names = NUEVA LISTA
  26. 26. Relaciones avanzadas
  27. 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. 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. 29. Relaciones avanzadas • @CollectionOfElements, una lista de valores simpres o @ElementCollection o @CollectionTable(name="___", joinColumns=@JoinColumn(name="__"))
  30. 30. Relaciones avanzadas • • @OneToOne o foreign key o tabla o compartiendo primary key Mapas o @MapKey(name="number")
  31. 31. Relaciones avanzadas • Las relaciones es la parte más complicada (IMHO) de Hibernate: o Tirar de referencia
  32. 32. Más mapeos
  33. 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. 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. 35. Tipos
  36. 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. 37. FAQ
  38. 38. FAQ • • ...
  39. 39. ¿Dudas?
  40. 40. Hibernate / JPA

×