Esta presentación les ayudará a entender como JPA maneja las relaciones de clases y las llaves primarias compuestas.
Además de como crear validadores y conversores.
5. Una entidad es un objeto del dominio de persistencia, pero mucho mas ligero. Típicamente una entidad representa una tabla de un modelo de datos relacional, en donde cada instancia de la entidad es una fila en dicha tabla.JPA brinda soporte para facilitar la construcción y mantenimiento de las relaciones entre clases, su cardinalidad: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany y la navegabilidad: Bidireccional y Unidireccional.Y finalmente, brinda gran facilidad al momento de mapear herencias o especializaciones entre objetos. ENTIDADES
6. Toda entidad debe tener una llave primariaPuede mapearse a una (llave primaria simple) o más (llave primaria compuesta) propiedades Consiste de múltiples llaves primarias simples LAVES PRIMARIAS COMPUESTAS
7. Consiste de múltiples llaves primarias Puede ser representada por un clase “Primary Key” que… debe ser Serializable publicclassMowerPKimplementsjava.io.Serializable { debe tener un constructor público sin paso de parámetros publicMowerPK() { … } debe implementar los métodos equals() y hashCode() publicinthashCode() { ... } publicbooleanequals(Objectobj) { ... } LlavesPrimariasCompuestas
8. No es usada internamente por clases persistentes Usado por el EntityManager Ejemplo de esquema de base de datos create table MOWER ( make varchar(255) not null, model varchar(255) not null, size integer not null, primary key (make, model) ) Usando una Clase Primary Key como un IdClass
13. Esquemade base de datos create table NAPSACK ( NAPSACK_MAKE varchar(255) not null, NAPSACK_MODEL varchar(255) not null, size integer not null, primary key (NAPSACK_MAKE, NAPSACK_MODEL) ) Usando un clase Primary Key como un EmbeddedId
14. package ejava.examples.orm.core.annotated; import java.io.Serializable; import javax.persistence.*; @Embeddable public class NapsackPKimplements Serializable { private static final long serialVersionUID = 1L; private String make; private String model; public NapsackPK() { … } public NapsackPK(String make, String model) { this.make = make; this.model = model; } @Column(name="NAPSACK_MAKE") public String getMake() { return make; } public void setMake(String make) { this.make = make; } … Ejemplo de EmbeddedId
15. @Column(name="NAPSACK_MODEL") public String getModel() { return model; } public void setModel(String model) { this.model = model; } public inthashCode() { return make.hashCode() + model.hashCode(); } public booleanequals(Object obj) { try { if (this == obj) return true; return make.equals(((NapsackPK)obj).getMake()) && model.equals(((NapsackPK)obj).getModel()); } catch (Throwable ignored) { //catch NP & Cast Exceptions return false; } } public String toString() { return super.toString() + ", make=" + make + ", model=" + model; } } Ejemplo de EmbeddedId(Cont.)
16. package ejava.examples.orm.core.annotated; import java.io.Serializable; import javax.persistence.*; @Entity @Table(name="NAPSACK") public class Napsack implements Serializable { private static final long serialVersionUID = 1L; private NapsackPKpk; private int size; public Napsack() {} public Napsack(String make, String model) { this.pk = new NapsackPK(make, model); } @EmbeddedId public NapsackPKgetPk() { return pk; } public void setPk(NapsackPKpk) { this.pk = pk; } … } Ejemplo de uso de EmbeddedIdusando Anotaciones
17. JPA reconoce y mapea las relaciones en el modelo de datos relacional y lo translada a las clases en el modelo de dominioDe este modo, las cardinalidades como Uno-a-Uno, Muchos-a-Uno, Uno-a-Muchos y Muchos-a-Muchos existen como anotaciones en el marco de trabajo JPAEstas anotaciones también son susceptible a cierta optimización de acuerdo a ciertas características que veremos a continuación MAPEO DE OBJETOS Y RELACIONES
21. public interface OneToOne extends ... { Class targetEntity() default void.class claseentidad a la queestárelacionada usualmente se determinapor el tipo de la propiedad CascadeType[] cascade() default {} define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado FetchType fetch() default EAGER define el modo de carga del objetorelacionado boolean optional() default true define siwl valor de la relaciónpuedesernula o no String mappedBy() default “” usado solo en relacionesbidireccionales en el ladoinverso de la relación señala la propiedadremota en la clasedueña de la relaciónque define el mapeo a la base de datos Anotación @OneToOne
22. public interface JoinColumns extends ... { public abstract JoinColumn[] value(); define un arreglo de claves foráneasque son parte de unallaveprimariacompuesta Example Usage @OneToOne @JoinColumns({ @JoinColumn(...), @JoinColumn(...) }) Anotación @JoinColumns
26. public interface ManyToOneextends ... { Class targetEntity() default void.class claseentidad a la queestárelacionada usualmente se determinapor el tipo de la propiedad CascadeType[] cascade() default {} define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado FetchType fetch() default EAGER define el modo de carga del objetorelacionado boolean optional() default true define siwl valor de la relaciónpuedesernula o no Anotación @ManyToOne
27. public interface OneToManyextends ... { Class targetEntity() default void.class claseentidad a la queestárelacionada usualmente se determinapor el tipo de la propiedad CascadeType[] cascade() default {} define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado FetchType fetch() default EAGER define el modo de carga del objetorelacionado String mappedBy() default “” usado solo en relacionesbidireccionales en el ladoinverso de la relación señala la propiedadremota en la clasedueña de la relaciónque define el mapeo a la base de datos Anotación @OneToMany
33. public interface JoinTable extends ... { muy similar a la anotación @Table String name() default “” nombre de la tablapara la tabla “join” String catalog() default “” nombre de la base de datos String schema() default “” nombre del esquema JoinColumn[] joinColumns() default {} arreglo de columnasquedefinen la clave foranea a esteobjeto JoinColumn[] inverseJoinColumns() default {} arreglo de columnasquedefinen la llaveforáneo al objetorelacionado UniqueConstraint[] uniqueConstraints() Anotación @JoinTable
37. public interface ManyToManyextends ... { Class targetEntity() default void.class claseentidad a la queestárelacionada usualmente se determinapor el tipo de la propiedad CascadeType[] cascade() default {} define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado FetchType fetch() default EAGER define el modo de carga del objetorelacionado String mappedBy() default “” usado solo en relacionesbidireccionales en el ladoinverso de la relación señala la propiedadremota en la clasedueña de la relaciónque define el mapeo a la base de datos Anotación @ManyToMany
38. ALL- combinación de todos los tiposPERSIST- objetosrelacionados son automáticamenteadministrados y seránpersistentes en la base de datoscuandohansidorelacionado a esteobjetoREMOVE- objetosrelacionados son eliminados de la base de datoscuandoesteobjetoeseliminadoREFRESH- objetosrelacionadostraeránsu “estado” de la base de datoscuandoesteobjetoes “refrescado”MERGE- objetosrelacionadosactualizaránsu “estado” en la base de datoscuandoesteobjetoesactualizado TIPOS DE CASCADA
39. JPA contiene anotaciones que permiten mapear herencia entre clases a la base de datos.Existen algunas estrategias para realizar esto:- TablaÚnica- TablaporClaseConcreta- TablaporClase(Join) MAPEO DE HERENCIA DE OBJETOS
42. public interface DiscriminatorColumn extends ... { define unacolumna en la tablaqueseñala el tipo de fila String name() default “DTYPE” Nombre de la columnaquealmacena el tipo de la fila DiscriminatorTypediscriminatorType() default STRING Tipo de dato de la columna “name” String columnDefinition(); Definiciónexplicita de la columna int length() Longitud de la cadenaparatipos STRING enumDiscriminatorType STRING CHAR INTEGER Anotación @DiscriminatorColumn
43. public interface DiscriminatorValue extends ... { Define el valor de la columnapara la columnadiscriminadora String value() pordefecto String – nombre de la entidad CHAR – valorespecífico INTEGER – valorespecífico Anotación @DiscriminatorValue
44. public interface Inheritance extends ...{ InheritanceTypestrategy() pordefectoSINGLE_TABLE enumInheritanceType SINGLE_TABLE Unatablaraizporcadajerarquía de clases TABLE_PER_CLASS Unatablaporcadaclaseconcreta JOINED Unatablaporcadaclase en la jerarquía Anotación @Inheritance
48. Resumen de la estrategia : Tabla por Sub-Clase (Join)
49. Implementación de un flujo de trabajoInteractúa con otros beansAccede directamente a la base de datos- operaciones «bulky»Ejemplo: Registrar Cuentavs. EntityBeans- representan datos compartidos en la base de datos- interactúa con datos generalmente al nivel individual de objeto-fila- Ejemplo: Cuenta BEANS DE SESIÓN
53. JSF pone a disposición del web-master una herramienta muy útil para la conversión de datos entre la vista y el bean administradoY como todo en Java, existen casos cuando uno necesita su «converter» personalizados. JSF ofrece un marco de trabajo para el desarrollo de «customconverters»JSF tiene un mecanismo de validación de datos, el cual ocurre antes que los datos del componente GUI actualicen el modelo en el beanadministrado CONVERTER Y VALIDATOR
56. Converters de JSF BigDecimalConverter BigIntegerConverter BooleanConverter ByteConverter CharacterConverter DateTimeConverter DoubleConverter FloatConverter IntegerConverter LongConverter NumberConverter ShortConverter TodosestosConverterstienen un error asociado a ellos, de tal forma que de no pasar la conversión, el error se visualizará en la pagina. DateTimeConverter y NumberConverter tienen sus propias etiquetas, esto nos dice que podemos configurar el formato de los datos del componente a través de los atributos de la etiqueta.
58. LongRangeValidator Nótese que existe un mensaje enlazado a la caja de texto, el cual capturará los mensajes de error que se disparen. Nótese que los valores máximo y mínimo del validador se pueden enlazar a propiedades de un bean administrado.
86. Una de las más grandes ventajas de la tecnología de Java Server Faces es que ofrece un conjunto de componentes que nos permiten concentrarnos en el proceso de desarrollo.