P2C5 Introducción a JEE5 - II

1,670 views
1,556 views

Published on

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.

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,670
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
59
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • lates.
  • P2C5 Introducción a JEE5 - II

    1. 1. Aurelio Martín Obando Távara<br />aot@upnorte.edu.pe<br />proyectos iiINTRODUCCIÓN A JEE5 – PARTE II<br />
    2. 2. EnalteciendoLos Temas<br />1<br />3<br />2<br />1<br />Entidades<br />Converter y Validator<br />Beans de Sesión<br />
    3. 3. AGENDA EntidadesBeans de SesiónConverter y ValidatorResumen<br />Clase 05<br />1<br />
    4. 4. 2<br />CONTENIDO<br />
    5. 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.<br />ENTIDADES<br />
    6. 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<br />LAVES PRIMARIAS COMPUESTAS<br />
    7. 7. Consiste de múltiples llaves primarias<br />Puede ser representada por un clase “Primary Key” que…<br />debe ser Serializable<br />publicclassMowerPKimplementsjava.io.Serializable {<br />debe tener un constructor público sin paso de parámetros<br />publicMowerPK() { … }<br />debe implementar los métodos equals() y hashCode()<br />publicinthashCode() { ... }<br />publicbooleanequals(Objectobj) { ... }<br />LlavesPrimariasCompuestas<br />
    8. 8. No es usada internamente por clases persistentes<br />Usado por el EntityManager<br />Ejemplo de esquema de base de datos<br /> create table MOWER (<br /> make varchar(255) not null, <br /> model varchar(255) not null, <br /> size integer not null, <br /> primary key (make, model)<br /> )<br />Usando una Clase Primary Key como un IdClass<br />
    9. 9. packageejava.examples.orm.core;<br />importjava.io.Serializable;<br />publicclassMowerPKimplementsSerializable {<br />privatestatic final longserialVersionUID = 1L;<br />privateStringmake;<br />privateStringmodel;<br />publicMowerPK() { … }<br />publicMowerPK(Stringmake, Stringmodel) {<br />this.make = make;<br />this.model = model;<br /> }<br />publicstaticlonggetSerialVersionUID() {<br />returnserialVersionUID;<br /> }<br />publicStringgetMake() {<br />returnmake;<br /> }<br />privatevoidsetMake(Stringmake) {<br />this.make = make;<br /> }<br />…<br />Ejemplo de Clase Compuesta PK<br />
    10. 10. …<br />publicStringgetModel() {<br />returnmodel;<br /> }<br />privatevoidsetModel(Stringmodel) {<br />this.model = model;<br /> }<br />publicinthashCode() {<br />returnmake.hashCode() + model.hashCode();<br /> }<br />publicbooleanequals(Objectobj) {<br /> try {<br />if (this == obj) return true;<br />returnmake.equals(((MowerPK)obj).getMake()) &&<br />model.equals(((MowerPK)obj).getModel());<br /> } catch (Throwableignored) { <br />return false;<br /> }<br /> } <br />publicStringtoString() {<br />returnsuper.toString() + ", make=" + make+ ", model=" + model;<br /> }<br />}<br />Ejemplo de Clase Compuesta PK (Cont.)<br />
    11. 11. packageejava.examples.orm.core.annotated;<br />importjava.io.Serializable;<br />importjavax.persistence.*;<br />importejava.examples.orm.core.MowerPK;<br />@Entity<br />@Table(name="MOWER")<br />@IdClass(MowerPK.class)<br />publicclassMowerimplementsSerializable {<br />privatestatic final longserialVersionUID = 1L;<br />privateStringmake;<br />privateStringmodel; <br />privateintsize;<br />publicMower() { … }<br />publicMower(Stringmake, Stringmodel) {<br />this.make = make;<br />this.model = model;<br />}<br />…<br />Ejemplo de uso de un IdClass<br />
    12. 12. …<br />@Id<br /> @Column(nullable=false, updatable=false)<br />publicStringgetMake() {<br />returnmake;<br /> }<br />privatevoidsetMake(Stringmake) {<br />this.make = make;<br /> }<br />@Id<br /> @Column(nullable=false, updatable=false)<br />publicStringgetModel() {<br />returnmodel;<br /> }<br />privatevoidsetModel(Stringmodel) {<br />this.model = model;<br /> }<br />publicintgetSize() {<br />returnsize;<br /> }<br />publicvoidsetSize(intsize) {<br />this.size = size;<br />}<br />}<br />Ejemplo de uso de un IdClass(Cont.)<br />
    13. 13. Esquemade base de datos<br />create table NAPSACK (<br /> NAPSACK_MAKE varchar(255) not null, <br /> NAPSACK_MODEL varchar(255) not null, <br /> size integer not null, <br /> primary key (NAPSACK_MAKE, NAPSACK_MODEL)<br />)<br />Usando un clase Primary Key como un EmbeddedId<br />
    14. 14. package ejava.examples.orm.core.annotated;<br />import java.io.Serializable;<br />import javax.persistence.*;<br />@Embeddable<br />public class NapsackPKimplements Serializable {<br /> private static final long serialVersionUID = 1L;<br /> private String make;<br /> private String model;<br />public NapsackPK() { … }<br /> public NapsackPK(String make, String model) {<br />this.make = make;<br />this.model = model;<br />}<br />@Column(name="NAPSACK_MAKE")<br /> public String getMake() {<br /> return make;<br /> }<br /> public void setMake(String make) {<br />this.make = make;<br /> }<br />…<br />Ejemplo de EmbeddedId<br />
    15. 15. @Column(name="NAPSACK_MODEL")<br /> public String getModel() {<br /> return model;<br /> }<br /> public void setModel(String model) {<br />this.model = model;<br /> }<br /> public inthashCode() {<br /> return make.hashCode() + model.hashCode();<br />}<br /> public booleanequals(Object obj) {<br /> try {<br /> if (this == obj) return true;<br /> return make.equals(((NapsackPK)obj).getMake()) &&<br />model.equals(((NapsackPK)obj).getModel());<br /> } catch (Throwable ignored) { //catch NP & Cast Exceptions <br /> return false;<br /> }<br /> }<br /> public String toString() {<br /> return super.toString() + ", make=" + make + ", model=" + model;<br />}<br />}<br />Ejemplo de EmbeddedId(Cont.)<br />
    16. 16. package ejava.examples.orm.core.annotated;<br />import java.io.Serializable;<br />import javax.persistence.*;<br />@Entity<br />@Table(name="NAPSACK")<br />public class Napsack implements Serializable {<br /> private static final long serialVersionUID = 1L;<br /> private NapsackPKpk;<br /> private int size;<br /> public Napsack() {}<br /> public Napsack(String make, String model) {<br /> this.pk = new NapsackPK(make, model);<br /> }<br />@EmbeddedId<br /> public NapsackPKgetPk() {<br /> return pk;<br /> }<br /> public void setPk(NapsackPKpk) {<br /> this.pk = pk;<br /> }<br /> …<br />}<br />Ejemplo de uso de EmbeddedIdusando Anotaciones<br />
    17. 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<br />MAPEO DE OBJETOS Y RELACIONES<br />
    18. 18. One-To-One (Uno-a-Uno)<br />
    19. 19. Uni-direccional<br />Bi-direccional<br />OneToOne<br />
    20. 20. OneToOne<br />
    21. 21. public interface OneToOne extends ... {<br />Class targetEntity() default void.class<br />claseentidad a la queestárelacionada<br />usualmente se determinapor el tipo de la propiedad<br />CascadeType[] cascade() default {}<br /> define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado<br />FetchType fetch() default EAGER<br /> define el modo de carga del objetorelacionado<br />boolean optional() default true<br /> define siwl valor de la relaciónpuedesernula o no<br />String mappedBy() default “”<br />usado solo en relacionesbidireccionales en el ladoinverso de la relación<br />señala la propiedadremota en la clasedueña de la relaciónque define el mapeo a la base de datos<br />Anotación @OneToOne<br />
    22. 22. public interface JoinColumns extends ... {<br />public abstract JoinColumn[] value();<br />define un arreglo de claves foráneasque son parte de unallaveprimariacompuesta<br />Example Usage<br />@OneToOne<br /> @JoinColumns({<br /> @JoinColumn(...),<br /> @JoinColumn(...)<br /> })<br />Anotación @JoinColumns<br />
    23. 23. Many-To-One (Muchos-a-Uno)<br />
    24. 24. Uni-direccional<br />Bi-direccional<br />ManyToOne<br />
    25. 25. ManyToOne<br />
    26. 26. public interface ManyToOneextends ... {<br />Class targetEntity() default void.class<br />claseentidad a la queestárelacionada<br />usualmente se determinapor el tipo de la propiedad<br />CascadeType[] cascade() default {}<br /> define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado<br />FetchType fetch() default EAGER<br /> define el modo de carga del objetorelacionado<br />boolean optional() default true<br /> define siwl valor de la relaciónpuedesernula o no<br />Anotación @ManyToOne<br />
    27. 27. public interface OneToManyextends ... {<br />Class targetEntity() default void.class<br />claseentidad a la queestárelacionada<br />usualmente se determinapor el tipo de la propiedad<br />CascadeType[] cascade() default {}<br /> define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado<br />FetchType fetch() default EAGER<br /> define el modo de carga del objetorelacionado<br />String mappedBy() default “”<br />usado solo en relacionesbidireccionales en el ladoinverso de la relación<br />señala la propiedadremota en la clasedueña de la relaciónque define el mapeo a la base de datos<br />Anotación @OneToMany<br />
    28. 28. Modificando una lista de objetos<br />
    29. 29. One-To-Many (Uno-a-Muchos)<br />
    30. 30. Uni-direccional<br />OneToMany<br />
    31. 31. OneToMany<br />
    32. 32. Link/JoinTable<br />
    33. 33. public interface JoinTable extends ... {<br />muy similar a la anotación @Table<br />String name() default “”<br />nombre de la tablapara la tabla “join”<br />String catalog() default “”<br />nombre de la base de datos<br />String schema() default “”<br />nombre del esquema<br />JoinColumn[] joinColumns() default {}<br />arreglo de columnasquedefinen la clave foranea a esteobjeto<br />JoinColumn[] inverseJoinColumns() default {}<br />arreglo de columnasquedefinen la llaveforáneo al objetorelacionado<br />UniqueConstraint[] uniqueConstraints()<br />Anotación @JoinTable<br />
    34. 34. Many-To-Many (Muchos-a-Muchos)<br />
    35. 35. Uni-direccional<br />Bi-direccional<br />ManyToMany<br />
    36. 36. ManyToMany<br />
    37. 37. public interface ManyToManyextends ... {<br />Class targetEntity() default void.class<br />claseentidad a la queestárelacionada<br />usualmente se determinapor el tipo de la propiedad<br />CascadeType[] cascade() default {}<br /> define queoperaciones de persistencia se realizan en modocascadasobre el objetorelacionado<br />FetchType fetch() default EAGER<br /> define el modo de carga del objetorelacionado<br />String mappedBy() default “”<br />usado solo en relacionesbidireccionales en el ladoinverso de la relación<br />señala la propiedadremota en la clasedueña de la relaciónque define el mapeo a la base de datos<br />Anotación @ManyToMany<br />
    38. 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<br />TIPOS DE CASCADA<br />
    39. 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)<br />MAPEO DE HERENCIA DE OBJETOS<br />
    40. 40. Estrategia de Herencia: Tabla Única<br />
    41. 41. Resumen de la estrategia : Tabla Única<br />
    42. 42. public interface DiscriminatorColumn extends ... {<br />define unacolumna en la tablaqueseñala el tipo de fila<br />String name() default “DTYPE”<br />Nombre de la columnaquealmacena el tipo de la fila<br />DiscriminatorTypediscriminatorType() default STRING<br />Tipo de dato de la columna “name”<br />String columnDefinition();<br />Definiciónexplicita de la columna<br />int length()<br />Longitud de la cadenaparatipos STRING<br />enumDiscriminatorType<br />STRING<br />CHAR<br />INTEGER<br />Anotación @DiscriminatorColumn<br />
    43. 43. public interface DiscriminatorValue extends ... {<br />Define el valor de la columnapara la columnadiscriminadora<br />String value() pordefecto<br />String – nombre de la entidad<br />CHAR – valorespecífico<br />INTEGER – valorespecífico<br />Anotación @DiscriminatorValue<br />
    44. 44. public interface Inheritance extends ...{<br />InheritanceTypestrategy() pordefectoSINGLE_TABLE<br />enumInheritanceType<br />SINGLE_TABLE<br />Unatablaraizporcadajerarquía de clases<br />TABLE_PER_CLASS<br />Unatablaporcadaclaseconcreta<br />JOINED<br />Unatablaporcadaclase en la jerarquía<br />Anotación @Inheritance<br />
    45. 45. Estrategia de Herencia: Tabla por Clase Concreta<br />
    46. 46. Resumen de la estrategia : Tabla por Clase Concreta<br />
    47. 47. Estrategia de Herencia: Tabla por Sub-Clase (Join)<br />
    48. 48. Resumen de la estrategia : Tabla por Sub-Clase (Join)<br />
    49. 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<br />BEANS DE SESIÓN<br />
    50. 50. Ejemplo de un flujo de trabajo bajo el patrón DAO<br />
    51. 51. Los bean de sesión eliminan la complejidad en el flujo de trabajo en el Cliente<br />
    52. 52. Beans de Sesión Stateless/Stateful<br />
    53. 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<br />CONVERTER Y VALIDATOR<br />
    54. 54. Modelo de Conversión<br />
    55. 55. Pasos para crear un Converter<br />
    56. 56. Converters de JSF<br />BigDecimalConverter<br />BigIntegerConverter<br />BooleanConverter<br />ByteConverter<br />CharacterConverter<br />DateTimeConverter<br />DoubleConverter<br />FloatConverter<br />IntegerConverter<br />LongConverter<br />NumberConverter<br />ShortConverter<br />TodosestosConverterstienen un error asociado a ellos, de tal forma que de no pasar la conversión, el error se visualizará en la pagina.<br />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.<br />
    57. 57. Modelo de Validación<br />
    58. 58. LongRangeValidator<br />Nótese que existe un mensaje enlazado a la caja de texto, el cual capturará los mensajes de error que se disparen.<br />Nótese que los valores máximo y mínimo del validador se pueden enlazar a propiedades de un bean administrado.<br />
    59. 59. 3<br />Resumen<br />
    60. 60. WAR<br />Interfaces de Usuario<br />Componentes GUI Personalizados<br />EAR<br />EJB<br />WAR<br />Richfaces 3.x<br />My Faces 1.7<br />Java Mail<br />Archivos de Configuración<br />Controladores<br />Delegados<br />utilitarios<br />Entidades del Negocio<br />SessionBeans<br />Seguridad<br />RESUMEN<br /><ul><li>Esta es la arquitectura de desarrollo que debemos respetar desde el inicio de la implementación hasta el despliegue de una aplicación empresarial.
    61. 61. Esta clase ha tocado las 3 capas de las 5 propuestas. ¿Cuales son estas 3 capas?</li></li></ul><li>RESUMEN<br /><ul><li>Lados de una relación
    62. 62. Lado dueño e inverso
    63. 63. Tipos de relación
    64. 64. OneToOne
    65. 65. Unidireccional, Bidireccional
    66. 66. ManyToOne
    67. 67. Unidireccional, Bidireccional
    68. 68. OneToMany
    69. 69. Unidireccional (bidireccional igual que en ManyToOne)
    70. 70. ManyToMany
    71. 71. Unidireccional, Bidireccional
    72. 72. Tipos de colección
    73. 73. Collection, List, Set, Map
    74. 74. Tipo de Carga (Fetch)
    75. 75. EAGER y LAZY
    76. 76. Tipo de Cascada
    77. 77. ALL, PERSIST, REMOVE, MERGE, REFRESH</li></li></ul><li>RESUMEN<br /><ul><li>Estrategias de Herencia
    78. 78. Única Tabla por Herencia de Clases
    79. 79. Simple, rápido, no-normalizado, sin restricciones en base de datos
    80. 80. Tabla por Clase Concreta
    81. 81. No-normalizado, difícil de manejar polifórmicamente.
    82. 82. Menos portabilidad entre gestores de bases de datos
    83. 83. Tabla por Sub-Clase (Join)
    84. 84. Normalizado, capaz de definir restricciones
    85. 85. Converter y Validator
    86. 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.
    87. 87. Más aún, nos permite reutilizar sus interfaces de tal forma que podemos crear componentes personalizados.</li></li></ul><li>GRACIAS<br />
    88. 88. Encuentra esta presentación en el<br />AULA VIRTUAL<br /> O tambiénpuedesencontrarla<br />en . <br />Saludos!<br />

    ×