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.
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).
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.
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...
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)