Está en la página 1de 102

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@uniovi.es

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@uniovi.es

VT, no referencias entrantes

No es posible

nov-08

alb@uniovi.es

Representacin UML de VT

equivalentes

nov-08

alb@uniovi.es

Representacin en Java

nov-08

alb@uniovi.es

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




nov-08

String, Integer, Long, Double, etc

alb@uniovi.es

Cuidado en getters

Peligro!!!
Seguro, String es inmutable
Peligro!!!

nov-08

alb@uniovi.es

Getters pueden romper


encapsulacin

nov-08

alb@uniovi.es

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



nov-08

Hibernate nativo  xml, hibernate annotations


JPA  annotations, xml
alb@uniovi.es

10

POJO Ejemplo (entidad)

nov-08

alb@uniovi.es

11

POJO Ejemplo (entidad)

nov-08

alb@uniovi.es

12

POJO Ejemplo (Value Object)


No lleva @Id
Tipo de acceso (field,
property) igual al de la
clase que lo incluye

nov-08

alb@uniovi.es

13

POJOs JPA



Constructor sin parmetros obligatorio


Identificador





Getters y Setters (get/set/is) para cada atributo





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
pueden ser privados
JPA puede usar los setters al cargar un objeto para ajustar
sus atributos

Colecciones para asociaciones many





nov-08

Puede ser Set<T>, List<T>, Map<T> o Collection<T>


Setters y getters pueden ser privados
alb@uniovi.es

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


nov-08

Debe implementar Serializable

alb@uniovi.es

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)


nov-08

getters y setters public o protected


alb@uniovi.es

16

Metadatos en XML



En fichero orm.xml
En persistence.xml


Fichero referenciados desde


persistence.xml

XML revoca las indicaciones de


Annotations


nov-08

En deploy pueden se pueden ajustar


rendimientos sin tocar cdigo fuente
alb@uniovi.es

17

Metadatos xml, ejemplo

nov-08

alb@uniovi.es

18

Categoras de anotaciones






Entity
Database Schema
Identity
Direct Mappings
Relationship
mappins
Composition

nov-08







Inheritance
Locking
Lifecycle
Entity Manager
Queries

alb@uniovi.es

19

Anotaciones por categora

nov-08

alb@uniovi.es

20

Anotaciones por categora

nov-08

alb@uniovi.es

21

Mapeo de clases

nov-08

alb@uniovi.es

22

Entidades


@Entity



Marca una clase como entidad


Atributo name opcional  ser el usado
en las queries

@Table

nov-08

alb@uniovi.es

23

@Colum



Condiciona la generacin de DDL


Por defecto (sin @Column) cada
atributo es un campo en tabla con
mismo nombre

nov-08

alb@uniovi.es

24

@Column, atributos
nov-08

alb@uniovi.es

25

@Embeddable



Marca una clase como ValueType


Se pueden configurar las propiedades
(o atributos) con etiquetas:


nov-08

@Basic, @Column, @Lob, @Temporal,


@Enumerated

alb@uniovi.es

26

@Basic


Aplicable a:

nov-08

alb@uniovi.es

27

@Enumerated


Cmo se salvan los valores enumerados





EnumType.ORDINAL
EnumType.STRING

En BDD se crear un
campo tipo INTEGER o
VARCHAR

nov-08

alb@uniovi.es

28

@Temporal


@Temporal


Matiza el formato final de los campos


java.util.Date y java.util.Calendar


nov-08

En la BDD sern DATE, TIME o TIMESTAMP

Opciones: DATE, TIME, TIMESTAMP

alb@uniovi.es

29

@Lob,@Transient


@Lob

@Transient

nov-08

alb@uniovi.es

30

Tabla de tipos hibernate

nov-08

alb@uniovi.es

31

Tabla de tipos hibernate (2)

nov-08

alb@uniovi.es

32

Mapeo de clases

nov-08

alb@uniovi.es

33

Identity vs equality




Java identity
Object equality
Database identity





a.getId().equals(b.getId())
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




nov-08

El periodo de tiempo que s lo son se le denomina "mbito


de identidad garantizada, mbito de persistencia

alb@uniovi.es

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@uniovi.es

35

Tipos de claves





Claves candidatas
Claves naturales
Business keys
Claves artificiales (subrogadas)
Cual es mejor para
formar la clave primaria?

nov-08

alb@uniovi.es

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@uniovi.es

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




nov-08

Siempre son NOT-NULL?


Nunca van a cambiar?
Nunca se van a repetir?
alb@uniovi.es

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@uniovi.es

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
uuid.hex
Nuevas implementando un interfaz

generan int, long o short


nov-08

alb@uniovi.es

40

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@uniovi.es

41

@Id


En cada entidad al menos:





nov-08

Una @Id
Multiple @Id y una @IdClass para la clase
que forma clave (clave compuesta)
Una @EmbeddedId

alb@uniovi.es

42

@GeneratedValue


Indica que la clave no es asignada por


el programa sino generada por el
sistema. Varias estrategias posibles

nov-08

alb@uniovi.es

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@uniovi.es

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@uniovi.es

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@uniovi.es

46

Mapeo de clases

nov-08

alb@uniovi.es

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


nov-08

En JPA siempre llevan identificador y deben


ajustarse a un convenio de nombres
(mnimo)
alb@uniovi.es

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@uniovi.es

49

Referencias


A entidades


Se salvan como claves ajenas

A value types


nov-08

Se salvan en la misma tabla excepto si son


colecciones (p.e. un usuario tiene varias
direcciones)
Se usa la etiqueta @Embedded

alb@uniovi.es

50

Ejemplo

nov-08

alb@uniovi.es

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@uniovi.es

52

Mapeo de clases

nov-08

alb@uniovi.es

53

Estrategias para mapear


herencia



JPA permite 3
Tabla por cada clase no abstracta


Tabla por cada clase




InheritanceType.TABLE_PER_CLASS
InheritanceType.JOINED

Tabla nica para toda la jerarqua




nov-08

InheritanceType.SINGLE_TABLE
alb@uniovi.es

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


Ventajas


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
Cuando slo se necesitan consultas contra las clases hijas

Recomendable


nov-08

Cuando no sea necesario el polimorfismo

alb@uniovi.es

55

Table per concrete class


Se crea una tabla por cada
clase no abstracta
abstracta

nov-08

alb@uniovi.es

56

Table per concrete class

Atencin: Opcional en JPA, puede


que no todos los proveedores JPA
la soporten

nov-08

alb@uniovi.es

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



nov-08

Todas las columnas no comunes deben ser nullables


Pueden quedar columnas vacas
alb@uniovi.es

58

Table per class hierarchy (2)




Mapeo



En la clase raiz aadir @DiscriminatorColumn


En cada clase hija aadir @DiscriminatorValue

Recomendacin


nov-08

Si las clases hijas tienen pocas propiedades (se


diferencian ms en comportamiento) y se
necesitan asociaciones polimrficas
Debera ser tomada como estrategia por defecto

alb@uniovi.es

59

Table per class hierarchy (3)

nov-08

alb@uniovi.es

60

Table per class hierarchy (4)

@DiscriminatorColumn,
@DiscriminatorValue
no son necesarios, se toman valores por
defecto si no estn presentes

nov-08

alb@uniovi.es

61

InheritanceType.JOINED

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


nov-08

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
alb@uniovi.es

62

Table per subclass (2)




Recomendacin





nov-08

Si las clases hijas se diferencian mucho en


sus propiedades y tienen muchas
Si se necesita polimorfismo
Cuando los nullables den problemas

alb@uniovi.es

63

Table per subclass (3)

nov-08

alb@uniovi.es

64

Table per subclass (4)

nov-08

alb@uniovi.es

65

Mapeo de clases

nov-08

alb@uniovi.es

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@uniovi.es

67

Forma de inicializar
colecciones
Siempre se declara
el Interfaz genrico
Siempre se inicializan
en la declaracin, no
en el constructor

nov-08

alb@uniovi.es

Siempre se asigna
una clase de
implementacin
compatible con el
interfaz

68

Relacin entre colecciones JDK


y mapeos hibernate

Lo ms usado
para colecciones

nov-08

alb@uniovi.es

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@uniovi.es

70

Mapeo de List
@Column, @JoinTable
opcionales

Perserva el
orden

nov-08

alb@uniovi.es

71

Mapeo de Bag

Clave artificial para hacer cada fila


nica (bag permite duplicados)

nov-08

alb@uniovi.es

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@uniovi.es

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@uniovi.es

74

Sorted collections
Solo para Set y Map
(se hace en JVM)

nov-08

alb@uniovi.es

75

Ordered collections

Para cualquier coleccin


(excepto List()); se hace
en la BDD con un order by

nov-08

alb@uniovi.es

76

Colecciones de
componentes

Esta clase debe tener


redefinidos hashCode() y
equals()

nov-08

alb@uniovi.es

77

Mapeo de clases

nov-08

alb@uniovi.es

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 AB que BA

nov-08

alb@uniovi.es

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@uniovi.es

80

Multiplicidad en JPA





one-to-one
many-to-many
one-to-many
many-to-one


nov-08

son direccionales, esta es la inversa de una


one-to-many

alb@uniovi.es

81

Unidireccional muchos a uno

Bid siempre debe


tener un Item

nov-08

alb@uniovi.es

82

Bidireccional uno a muchos

Doble actualizacin
nov-08

alb@uniovi.es

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@uniovi.es

84

Propagacin en cascada

Si no hay cascada
hay que salvar los
dos objetos aunque
estn asociados

nov-08

Con cascada basta salvar


al padre (persistencia por
alcanzabilidad)

alb@uniovi.es

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@uniovi.es

86

Tipos de cascada hibernate

nov-08

alb@uniovi.es

87

Tipos de cascada JPA








ALL
MERGE
PERSIST
REFRESH
REMOVE

nov-08

alb@uniovi.es

88

Cascada delete-orphan

No ser una composicin?

nov-08

alb@uniovi.es

89

Uno o uno con foreign key

En la clase que no
tiene la FK

nov-08

alb@uniovi.es

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


nov-08

Se usa un generador especial para la


segunda
alb@uniovi.es

91

Uno a uno
misma Clave
Con este generador toma la
clave de la otra

nov-08

alb@uniovi.es

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@uniovi.es

93

Uno a muchos con Bag

nov-08

alb@uniovi.es

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@uniovi.es

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@uniovi.es

96

Muchos a muchos
unidireccional

Se puede hacer
tambin con List
e idBag

nov-08

alb@uniovi.es

97

Muchos a muchos
bidireccional
@JoinTable opcional

nov-08

alb@uniovi.es

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@uniovi.es

99

Clase asociativa

Clase para la clave


compuesta

...
nov-08

alb@uniovi.es

100

Clave compuesta:
la clase Id debe cumplir
unas condiciones

nov-08

alb@uniovi.es

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@uniovi.es

102

También podría gustarte