Mapeo de clases
Sistemas de persistencia de objetos
Entidades
Un entidad representa un concepto del dominio Puede estar asociada con otras entidades Su ciclo de vida es independiente Debe tener una clave primaria
nov-08
alb@[Link]
Value Types
Representan informacin adicional, no conceptos principales de dominio Se suelen presentar como atributos de una entidad o como composiciones (UML) Su ciclo de vida depende enteramente de la entidad que las posee No pueden tener referencias entrantes
nov-08 alb@[Link] 3
VT, no referencias entrantes
No es posible
nov-08
alb@[Link]
Representacin UML de VT
equivalentes
nov-08
alb@[Link]
Representacin en Java
nov-08
alb@[Link]
Paso de Value Types
Siempre por copia
En java por defecto se pasan referencias Problemas al recibir en setters Cuidado con los getters
Alternativa: inmutables
Las clases bsicas del JDK
String, Integer, Long, Double, etc
nov-08
alb@[Link]
Cuidado en getters
Peligro!!! Seguro, String es inmutable Peligro!!!
nov-08
alb@[Link]
Getters pueden romper encapsulacin
nov-08
alb@[Link]
POJO (plain old java objects)
Las clases que necesitan ser persistentes son clases java planas (java beans) Tienen que respetar un mnimo convenio de nombrado
Setters/getters, constructor sin parmetros, etc.
La informacin necesaria para persistencia se aade en forma de metadatos
Hibernate nativo xml, hibernate annotations JPA annotations, xml
nov-08 alb@[Link] 10
POJO Ejemplo (entidad)
nov-08
alb@[Link]
11
POJO Ejemplo (entidad)
nov-08
alb@[Link]
12
POJO Ejemplo (Value Object)
No lleva @Id Tipo de acceso (field, property) igual al de la clase que lo incluye
nov-08
alb@[Link]
13
POJOs JPA
Constructor sin parmetros obligatorio Identificador
Preferiblemente no tipos bsicos (int, long, etc.), mejor tipos nullables (Integer, Long, etc.) Mejor no claves compuestas Se correspondern con la clave primaria de la tabla
Getters y Setters (get/set/is) para cada atributo
pueden ser privados JPA puede usar los setters al cargar un objeto para ajustar sus atributos
Colecciones para asociaciones many
Puede ser Set<T>, List<T>, Map<T> o Collection<T> Setters y getters pueden ser privados
nov-08 alb@[Link] 14
Persistencia de campos en JPA
Todos tipos JDK tienen persistencia automtica Campos de otro tipo:
Referencias a ValueTypes: si son de clases @Embeddable todos los campos a la misma tabla Referencias a Entidades: son relaciones, no campos. FK a la tabla de @Entity Resto de casos, serializacin
Debe implementar Serializable
nov-08
alb@[Link]
15
Metadatos en annotations
@Entity entidades @Embeddable Value Types La posicin de @Id determina el modo de acceso del motor de persistencia a los atributos
Acceso field (public, private, protected, package) Acceso properties (a travs de get/set)
getters y setters public o protected
nov-08 alb@[Link] 16
Metadatos en XML
En fichero [Link] En [Link]
Fichero referenciados desde [Link]
XML revoca las indicaciones de Annotations
En deploy pueden se pueden ajustar rendimientos sin tocar cdigo fuente
nov-08 alb@[Link] 17
Metadatos xml, ejemplo
nov-08
alb@[Link]
18
Categoras de anotaciones
Entity Database Schema Identity Direct Mappings Relationship mappins Composition
nov-08
Inheritance Locking Lifecycle Entity Manager Queries
alb@[Link]
19
Anotaciones por categora
nov-08
alb@[Link]
20
Anotaciones por categora
nov-08
alb@[Link]
21
Mapeo de clases
nov-08
alb@[Link]
22
Entidades
@Entity
Marca una clase como entidad Atributo name opcional ser el usado en las queries
@Table
nov-08
alb@[Link]
23
@Colum
Condiciona la generacin de DDL Por defecto (sin @Column) cada atributo es un campo en tabla con mismo nombre
nov-08
alb@[Link]
24
@Column, atributos
nov-08
alb@[Link]
25
@Embeddable
Marca una clase como ValueType Se pueden configurar las propiedades (o atributos) con etiquetas:
@Basic, @Column, @Lob, @Temporal, @Enumerated
nov-08
alb@[Link]
26
@Basic
Aplicable a:
nov-08
alb@[Link]
27
@Enumerated
Cmo se salvan los valores enumerados
[Link] [Link]
En BDD se crear un campo tipo INTEGER o VARCHAR
nov-08
alb@[Link]
28
@Temporal
@Temporal
Matiza el formato final de los campos [Link] y [Link]
En la BDD sern DATE, TIME o TIMESTAMP
Opciones: DATE, TIME, TIMESTAMP
nov-08
alb@[Link]
29
@Lob,@Transient
@Lob
@Transient
nov-08
alb@[Link]
30
Tabla de tipos hibernate
nov-08
alb@[Link]
31
Tabla de tipos hibernate (2)
nov-08
alb@[Link]
32
Mapeo de clases
nov-08
alb@[Link]
33
Identity vs equality
Java identity Object equality Database identity
[Link]().equals([Link]()) clave primaria de la tabla Se mapean con la etiqueta <id> Por ello todas las clases Entidad deben tener identificador identificador, usualmente un Long
No siempre sern iguales
El periodo de tiempo que s lo son se le denomina "mbito de identidad garantizada, mbito de persistencia
nov-08
alb@[Link]
34
Identidad de BBDD
protected
La clave debe ser inmutable, una vez asignada no se puede cambiar JPA usa el setter cuando se carga en memoria. No debe ser pblico y no puede ser privado protected
nov-08
alb@[Link]
35
Tipos de claves
Claves candidatas Claves naturales Business keys Claves artificiales (subrogadas)
Cual es mejor para formar la clave primaria?
nov-08
alb@[Link]
36
Clave candidata
Condiciones
Nunca puede ser NULL Cada fila es una combinacin nica Nunca puede cambiar
Si hay varias se escogera solo una, las otras son UNIQUE Se forman con una sola o combinaciones de propiedades Si no hay ninguna est mal el diseo
nov-08 alb@[Link] 37
Claves naturales
Tienen significado en el contexto de uso (para el usuario: las entiende y las maneja)
DNI N de la SS
La experiencia demuestra que causan problemas a largo plazo si se usan como claves primarias
Siempre son NOT-NULL? Nunca van a cambiar? Nunca se van a repetir?
nov-08 alb@[Link]
Y si nos equivocamos al dar el alta?, luego no se puede cambiar
38
Business keys
Podran ser claves candidatas Pero existe la probabilidad (baja) de que su valor cambie en el tiempo Son de utilidad para el usuario ya que las emplea de forma cotidiana
P.e. el nombre del departamento (puede cambiar pero pocas veces)
No sirven como clave primaria pero tienen su utilidad
nov-08 alb@[Link] 39
Claves artificiales (surrogate keys)
Sin significado en el contexto Siempre generadas por el sistema Varias estrategias de generacin
JPA
Hib
AUTO JPA selecciona segn BBDD IDENTITY Ver documentacin de referencia SEQUENCE TABLE genera string de 32 caracteres hi/lo nico en el mundo [Link] Nuevas implementando un interfaz
nov-08 alb@[Link] 40
generan int, long o short
Estrategia recomendable
Usar siempre claves artificiales como claves primarias
Excepto en el caso de BBDD legacy
Tipo Long suele ser suficiente e indexa de forma eficiente Las claves candidatas se hacen UNIQUE Las candidatas (y si no hay, las business keys) son las que se emplean en el equals()
nov-08 alb@[Link] 41
@Id
En cada entidad al menos:
Una @Id Multiple @Id y una @IdClass para la clase que forma clave (clave compuesta) Una @EmbeddedId
nov-08
alb@[Link]
42
@GeneratedValue
Indica que la clave no es asignada por el programa sino generada por el sistema. Varias estrategias posibles
nov-08
alb@[Link]
43
El problema del equals() y hashCode()
Suponiendo que el hashCode() y el equals() se calculan incluyendo el nombre del usuario i == ii ?
nov-08
alb@[Link]
44
HashCode() y equals()
Los Set() y Map() emplean hasCode() y equals() para insertar y luego localizar los elementos en tablas hash. Si cambian atributos despus de haber introducido un objeto en Set() o Map() no se volver a encontrar o se podrn insertar repetidos El contrato de uso de Set() y Map() exige que no se cambien los atributos del objeto mientras estn en la coleccin Sobre qu atributos hay que definir hashCode() y equals()?
nov-08 alb@[Link] 45
HashCode() y equals()
No se pueden definir sobre las claves artificiales ya que no existen hasta que no se inserta en la BBDD
Se generan all, al hacer el INSERT Al final de la transaccin
Se deben definir sobre los atributos que forman una clave candidata o en su defecto sobre una business key
nov-08 alb@[Link] 46
Mapeo de clases
nov-08
alb@[Link]
47
Entities vs Value types
Una de las riquezas de los modelos OO ms clases que tablas Entidades son aquellas clases de las cuales los objetos son relevantes para el usuario
En JPA siempre llevan identificador y deben ajustarse a un convenio de nombres (mnimo)
nov-08 alb@[Link] 48
Entities vs Value types
Tipos valor son aquellas clases cuya identidad no es conocida por el usuario, ni le importa
Tienen semntica de composicin o directamente aparecen como atributos en los diagramas UML Las clases JDK (Integer, Long, etc.) son de este tipo Su ciclo de vida depende totalmente de la entidad a la que estn asignados Los objetos Valor slo tienen referencias entrantes de los objetos que los poseen y no pueden ser compartidos con otros objetos
La diferencia entre uno y otro es difcil de definir ya que depende del contexto
nov-08 alb@[Link] 49
Referencias
A entidades
Se salvan como claves ajenas
A value types
Se salvan en la misma tabla excepto si son colecciones (p.e. un usuario tiene varias direcciones) Se usa la etiqueta @Embedded
nov-08
alb@[Link]
50
Ejemplo
nov-08
alb@[Link]
51
Mapeos
Si hay ms de un VT del mismo tipo en una entidad hay que forzar los nombres de las columnas ya que si no se repiten en el DDL
nov-08
alb@[Link]
52
Mapeo de clases
nov-08
alb@[Link]
53
Estrategias para mapear herencia
JPA permite 3 Tabla por cada clase no abstracta
InheritanceType.TABLE_PER_CLASS
Tabla por cada clase
[Link]
Tabla nica para toda la jerarqua
InheritanceType.SINGLE_TABLE
nov-08 alb@[Link] 54
InheritanceType.TABLE_PER_CLASS
Table per concrete class
Una tabla por cada clase no abstracta Las propiedades heredadas se repiten en cada tabla Problemas
Asociaciones polimrficas (de la superclase) se hacen poniendo la FK en cada tabla Consultas polimrficas son menos eficientes, son varias SELECT o una UNION Cambios en la superclase se propagan por todas las tablas
Ventajas
Cuando slo se necesitan consultas contra las clases hijas
Recomendable
Cuando no sea necesario el polimorfismo
nov-08
alb@[Link]
55
Table per concrete class
Se crea una tabla por cada clase no abstracta abstracta
nov-08
alb@[Link]
56
Table per concrete class
Atencin: Opcional en JPA, puede que no todos los proveedores JPA la soporten
nov-08
alb@[Link]
57
InheritanceType.SINGLE_TABLE
Table per class hierarchy
Todas las clases persisten en una nica tabla con la unin de todas las columnas de todas las clases Usa un discriminador en cada fila para distinguir el tipo Ventajas
Es simple y eficiente Soporta el polimorfismo Fcil de implementar Fcil modificar cualquier clase
Desventaja
Todas las columnas no comunes deben ser nullables Pueden quedar columnas vacas
nov-08 alb@[Link] 58
Table per class hierarchy (2)
Mapeo
En la clase raiz aadir @DiscriminatorColumn En cada clase hija aadir @DiscriminatorValue
Recomendacin
Si las clases hijas tienen pocas propiedades (se diferencian ms en comportamiento) y se necesitan asociaciones polimrficas Debera ser tomada como estrategia por defecto
nov-08
alb@[Link]
59
Table per class hierarchy (3)
nov-08
alb@[Link]
60
Table per class hierarchy (4)
@DiscriminatorColumn, @DiscriminatorValue no son necesarios, se toman valores por defecto si no estn presentes
nov-08
alb@[Link]
61
[Link]
Table per subclass
Cada clase de la jerarqua tiene su propia tabla Las relaciones de herencia se resuelven con FK Cada tabla solo tiene columnas para las propiedades no heredadas Ventaja
Modelo relacional completamente normalizado Integridad se mantiene Soporta polimorfismo Evoluciona bien
Desventaja
Si hay que hacer cosas a mano las consultas son mas complicadas Para jerarquas muy complejas el rendimiento en consultas puede ser pobre, muchas joins
nov-08 alb@[Link] 62
Table per subclass (2)
Recomendacin
Si las clases hijas se diferencian mucho en sus propiedades y tienen muchas Si se necesita polimorfismo Cuando los nullables den problemas
nov-08
alb@[Link]
63
Table per subclass (3)
nov-08
alb@[Link]
64
Table per subclass (4)
nov-08
alb@[Link]
65
Mapeo de clases
nov-08
alb@[Link]
66
Colecciones de Value Types
No existen en JPA, solo hibernate Sets, bags, lists, y maps de value types Forma estndar (idiom) en hibernate de inicializar una coleccin
nov-08
alb@[Link]
67
Forma de inicializar colecciones
Siempre se declara el Interfaz genrico Siempre se inicializan en la declaracin, no en el constructor
Siempre se asigna una clase de implementacin compatible con el interfaz
nov-08
alb@[Link]
68
Relacin entre colecciones JDK y mapeos hibernate
Lo ms usado para colecciones
nov-08
alb@[Link]
69
Mapeo de Set
@Column, @JoinTable opcionales, solo fuerzan nombres de tabla y columna
La clave de ITEM_IMAGE es compuesta para evitar duplicados en el mismo ITEM (un set no los admite)
nov-08 alb@[Link] 70
Mapeo de List
@Column, @JoinTable opcionales
Perserva el orden
nov-08
alb@[Link]
71
Mapeo de Bag
Clave artificial para hacer cada fila nica (bag permite duplicados)
nov-08
alb@[Link]
72
Mapeo de Map
@Column, @JoinTable opcionales
Guarda las claves del mapa La clave se forma con ITEM_ID + IMAGENAME, no se permiten duplicados
nov-08 alb@[Link] 73
Sorted & ordered cols.
En hibernate no es lo mismo
Sorted se hace en memoria (JVM) usando interfaz Comparable Ordered se hace en la BBDD con SQL
Sorted solo aplicable a SortedMap y SortedSet
nov-08
alb@[Link]
74
Sorted collections
Solo para Set y Map (se hace en JVM)
nov-08
alb@[Link]
75
Ordered collections
Para cualquier coleccin (excepto List()); se hace en la BDD con un order by
nov-08
alb@[Link]
76
Colecciones de componentes
Esta clase debe tener redefinidos hashCode() y equals()
nov-08
alb@[Link]
77
Mapeo de clases
nov-08
alb@[Link]
78
No son gestionadas
Al contrario que en EJB 2.x no son gestionadas Un asociacin Java es unidireccional, es una referencia Hibernate no cambia la semntica de Java No es lo mismo de A B que B A
nov-08 alb@[Link] 79
Asociaciones en Java
Si la relacin es bidireccional siempre hay que establecer la relacin en las dos clases Se podra aadir un mtodo como este para gestionar de forma cmoda la relacin
nov-08
alb@[Link]
80
Multiplicidad en JPA
one-to-one many-to-many one-to-many many-to-one
son direccionales, esta es la inversa de una one-to-many
nov-08
alb@[Link]
81
Unidireccional muchos a uno
Bid siempre debe tener un Item
nov-08
alb@[Link]
82
Bidireccional uno a muchos
Doble actualizacin
nov-08 alb@[Link] 83
La doble actualizacin
En java es necesaria pero en SQL la asociacin es una foreign key. Solo se actualiza el campo en una tabla. Hibernate vigila ambos extremos y detecta las dos modificaciones en Java Se producirn dos INSERT o dos UPDATE (segn) cuando slo una es necesaria Para evitarlo se marca un extremo con mappedBy=campo_FK_del_otro_extremo
nov-08 alb@[Link] 84
Propagacin en cascada
Si no hay cascada hay que salvar los dos objetos aunque estn asociados
Con cascada basta salvar al padre (persistencia por alcanzabilidad)
nov-08
alb@[Link]
85
Cascada o persistencia transitiva
Se llama de las dos formas Se da en las relaciones padre/hijo (los hijos dependen del padre) Se puede especificar por separado el tipo cascada deseado para cada asociacin
En doc de referencia buscar tipos de cascada Transitive persistence
nov-08 alb@[Link] 86
Tipos de cascada hibernate
nov-08
alb@[Link]
87
Tipos de cascada JPA
ALL MERGE PERSIST REFRESH REMOVE
nov-08
alb@[Link]
88
Cascada delete-orphan
No ser una composicin?
nov-08
alb@[Link]
89
Uno o uno con foreign key
En la clase que no tiene la FK
nov-08
alb@[Link]
90
Uno a uno con la misma clave
Dos tablas comparten la misma clave
Es clave primaria en las dos Y adems foreign key en una de ellas
Problema: solo se genera una clave, la segunda tabla debe esperar a que se genere en la primera
Se usa un generador especial para la segunda
nov-08 alb@[Link] 91
Uno a uno misma Clave
Con este generador toma la clave de la otra
nov-08
alb@[Link]
92
Uno a muchos con Bag
Ya est visto con SET pero se puede hacer con BAG si no se necesita ordenacin y se permiten duplicados Al no tener que garantizar el orden ni vigilar los duplicados no hace falta cargar la coleccin para hacer las inserciones. Se consigue ms eficiencia.
nov-08 alb@[Link] 93
Uno a muchos con Bag
nov-08
alb@[Link]
94
Uno a muchos con List
Para mantener el orden en el que fueron insertados Esto es, no se ordenan despus de metidos como en SortedSet (o SortedMap)
No lleva mappedBy=
Esto anula actualizacin de este extremo
Dos @JoinColumn
nov-08 alb@[Link] 95
a Muchos @OrderBy
List mantiene en memoria el orden trado de BDD
pero en BDD no se mantiene el orden en el que se insertaron en List
nov-08 alb@[Link] 96
Muchos a muchos unidireccional
Se puede hacer tambin con List e idBag
nov-08
alb@[Link]
97
Muchos a muchos bidireccional
@JoinTable opcional
nov-08
alb@[Link]
98
Mapeo de clases asociativas
En java es una clase ms, mapeada con dos relaciones muchos a uno y clave compuesta En BDD una muchos a muchos con ms columnas
nov-08 alb@[Link] 99
Clase para la clave compuesta
Clase asociativa
...
nov-08 alb@[Link] 100
Clave compuesta: la clase Id debe cumplir unas condiciones
nov-08
alb@[Link]
101
Primary Key Class:
Es una clase Java (POJO) pblica. Constructor pblico sin argumentos. Si hay aceso por get/set deben ser public o protected. Debe ser serializable. Define equals() and hashCode().
nov-08
alb@[Link]
102