Professional Documents
Culture Documents
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 3
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
Alternativa: inmutables
Las clases bsicas del JDK
String, Integer, Long, Double, etc
nov-08
alb@uniovi.es
Cuidado en getters
nov-08
alb@uniovi.es
nov-08
alb@uniovi.es
nov-08
alb@uniovi.es
11
nov-08
alb@uniovi.es
12
nov-08
alb@uniovi.es
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
nov-08
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)
getters y setters public o protected
nov-08 alb@uniovi.es 16
Metadatos en XML
En fichero orm.xml En persistence.xml
Fichero referenciados desde persistence.xml
nov-08
alb@uniovi.es
18
Categoras de anotaciones
Entity Database Schema Identity Direct Mappings Relationship mappins Composition
nov-08
alb@uniovi.es
19
nov-08
alb@uniovi.es
20
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:
@Basic, @Column, @Lob, @Temporal, @Enumerated
nov-08
alb@uniovi.es
26
@Basic
Aplicable a:
nov-08
alb@uniovi.es
27
@Enumerated
Cmo se salvan los valores enumerados
EnumType.ORDINAL EnumType.STRING
nov-08
alb@uniovi.es
28
@Temporal
@Temporal
Matiza el formato final de los campos java.util.Date y java.util.Calendar
En la BDD sern DATE, TIME o TIMESTAMP
nov-08
alb@uniovi.es
29
@Lob,@Transient
@Lob
@Transient
nov-08
alb@uniovi.es
30
nov-08
alb@uniovi.es
31
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
nov-08
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
Siempre son NOT-NULL? Nunca van a cambiar? Nunca se van a repetir?
nov-08 alb@uniovi.es
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)
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
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:
Una @Id Multiple @Id y una @IdClass para la clase que forma clave (clave compuesta) Una @EmbeddedId
nov-08
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
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
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
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@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
InheritanceType.TABLE_PER_CLASS
Ventajas
Cuando slo se necesitan consultas contra las clases hijas
Recomendable
Cuando no sea necesario el polimorfismo
nov-08
alb@uniovi.es
55
nov-08
alb@uniovi.es
56
Atencin: Opcional en JPA, puede que no todos los proveedores JPA la soporten
nov-08
alb@uniovi.es
57
InheritanceType.SINGLE_TABLE
Desventaja
Todas las columnas no comunes deben ser nullables Pueden quedar columnas vacas
nov-08 alb@uniovi.es 58
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@uniovi.es
59
nov-08
alb@uniovi.es
60
@DiscriminatorColumn, @DiscriminatorValue no son necesarios, se toman valores por defecto si no estn presentes
nov-08
alb@uniovi.es
61
InheritanceType.JOINED
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@uniovi.es 62
nov-08
alb@uniovi.es
63
nov-08
alb@uniovi.es
64
nov-08
alb@uniovi.es
65
Mapeo de clases
nov-08
alb@uniovi.es
66
nov-08
alb@uniovi.es
67
nov-08
alb@uniovi.es
68
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
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
nov-08
alb@uniovi.es
76
Colecciones de componentes
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 A B que B A
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
son direccionales, esta es la inversa de una one-to-many
nov-08
alb@uniovi.es
81
nov-08
alb@uniovi.es
82
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
alb@uniovi.es
85
nov-08
alb@uniovi.es
87
nov-08
alb@uniovi.es
88
Cascada delete-orphan
nov-08
alb@uniovi.es
89
nov-08
alb@uniovi.es
90
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@uniovi.es 91
nov-08
alb@uniovi.es
92
nov-08
alb@uniovi.es
94
Dos @JoinColumn
nov-08 alb@uniovi.es 95
a Muchos @OrderBy
nov-08
alb@uniovi.es
97
nov-08
alb@uniovi.es
98
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
...
nov-08 alb@uniovi.es 100
nov-08
alb@uniovi.es
101
nov-08
alb@uniovi.es
102