Aurelio Martín Obando Távaraaot@upnorte.edu.peproyectos iiINTRODUCCIÓN A JEE5
EnalteciendoLos Temas132EntidadesDelegadosBeans de Sesión
AGENDA API de Persistencia de JavaEntidadesBeans de SesiónDelegadosResumenClase 021
2CONTENIDO
El API de Persistencia de Java	brinda facilidad al momento de interactuar con la 	base de datos y hacer el mapeo de objeto/relación 	respecto a un modelo de datos relacional en sus 	aplicaciones. JPAconsiste en 3 áres	El API de Persistencia de Java.	Mapeo de Objetos/Relaciones.	El lenguaje Consultas. API de Persistencia de Java
	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.Formalmente y eventualmente llamados “Entity Beans”.Clases listadas en el elemento “<class>”  en el archivo “persistence.xml”.No son persistentes hasta que están asociadas a un EntityManager.em.persist(author);ENTIDADES
Entidades
packagejava.examples.orm.core.annotated;importjavax.persistence.*; @EntitypublicclassBike {privatelong id;privateStringmake;privateStringmodel;privateintsize;publicBike() {}publicBike(long id) { this.id = id; }@IdpubliclonggetId() {returnid;	}privatevoidsetId(long id) {		this.id = id;	}publicStringgetMake() {returnmake;	}publicvoidsetMake(Stringmake) {this.make= make;	}	...}Ejemplo de Entidad Anotada : Bike.java
packagejava.examples.orm.core.mapped;publicclassBike {privatelong id;privateStringmake;privateStringmodel;privateintsize;publicBike() {}publicBike(long id) { this.id = id; }publiclonggetId() {return id;    	}privatevoidsetId(long id) {        		this.id = id;    	}publicStringgetMake() {returnmake;    	}publicvoidsetMake(Stringmake) {this.make = make;    	}	...}Ejemplo de Entidad No-Anotada: Bike.java
Usado para determinar el nombre de la tabla automáticamenteBikeclassBiketable	El nombre de la Tabla puede ser especificado sin tener 	relación con el nombre de la entidad@Table(name=”table_name”)Usado para referenciar a una clase a través de EJB-QLNombre de la Entidad
Estructura elemental de mapeo
create table CAR (CAR_ID bigint not null, CAR_YEAR integer not null, CAR_MODEL varchar(20) not null, CAR_MAKE varchar(20) not null, CAR_COST double, primary key (CAR_ID))Ejemplo de un esquema de BD a mapear
package java.examples.orm.core.annotated;import javax.persistence.*;@Entity@Table(name="CAR")public class Car {        	private long id;    	private String make;    	private String model;    	private int year;    	private double cost;	public Car() {}    	public Car(long id) { this.id = id; }        	@Id@Column(name="CAR_ID", nullable=false)    	public long getId() {        		return id;    	}	private void setId(long id) {        		this.id = id;    	}	…Mapeo a BD usando Anotaciones
@Column(name="CAR_MAKE", 		unique=false, nullable=false, insertable=true,		updatable=true,		table="",  //nota: podemosapuntar a otratablaparaobtener la propiedad		length=20)    	public String getMake() {        		return make;    	}    	public void setMake(String make) {this.make = make;    	}@Column(name="CAR_MODEL", nullable=false, length=20)    	public String getModel() {        		return model;    	}    	public void setModel(String model) {this.model = model;    	}	…Mapeo a BD usando Anotaciones
@Column(name="CAR_YEAR", nullable=false)    	public intgetYear() {        		return year;    	}    	public void setYear(int year) {this.year = year;    	}@Column(name="CAR_COST", scale=7, precision=2)    	public double getCost() {        		return cost;    	}    	public void setCost(double cost) {this.cost = cost;    	}	...}Mapeo a BD usando Anotaciones
	Toda entidad debe tener una llave primariaLlaves primarias deben ser únicasPuede mapearse a una (llave primaria simple) o más (llave primaria compuesta) propiedades Las propiedades deben ser de tipo- tipos primitivos Java (incluido: Integer, Long, etc.)- java.lang.String- Clases de tipo llave primaria (compuesta de tipos de propiedades adecuados)LAVES PRIMARIAS SIMPLES
public interface javax.persistence.GeneratedValue {javax.persistence.GenerationType strategy();    String generator();}public final class javax.persistence.GenerationType extends java.lang.Enum{    public static final GenerationType TABLE;    public static final GenerationType SEQUENCE;    public static final GenerationType IDENTITY;    public static final GenerationType AUTO;}Llaves Primarias generadas
Tipo de Generación IDENTITY
Transient- Le dice al proveedor de persistencia que ignore este campo/propiedadFetchType- Le dice a la persistencia el modo de carga de las relaciones de una objetoTemporal- Especifica detalle para el mapeo de propiedades tipo Date y CalendarLob- Mapea tipos BLOB y CLOBEnumerated- Mapea tipo Enumerado Java SE 5REFINAMIENTO DE MAPEO
Uso de Transient
Ejemplo de Lob
package java.examples.orm.core.annotated;import java.io.Serializable;import javax.persistence.*;@Entity@Table(name=“UMBRELLA")public class Umbrella implements Serializable {    	private static final long serialVersionUID = 1L;    	private long id;    	private String make;    	private String model;    	public Umbrella() { }    	public Umbrella(long id)         { this.id = id; }    	@Id    	public long getId()              { return id; }    	private void setId(long id)      { this.id = id; }@Lob    	@Basic(fetch=FetchType.LAZY)    	public char[] getMake()          { return make.toCharArray(); }    	public void setMake(char[] make) { this.make = new String(make); }Ejemplo de Lob
Tipo Temporal y Enum
package java.examples.orm.core.annotated;import java.io.Serializable;import java.util.Date;import javax.persistence.*;Import java.examples.orm.core.ColorType;@Entity@Table(name="VASE")public class Vase implements Serializable {    	private static final long serialVersionUID = 1L;    	private long id;    	private Date aDate;    	private Date aTime;    	private Date aTimestamp;    	private ColorTypecolorId;    	private ColorTypecolorName;    	public Vase() {}    	public Vase(long id) { this.id = id; }	…Ejemplo con tipo Temporal y Enum
 @Temporal(TemporalType.DATE)public Date getADate() {	return aDate;}public void setADate(Date date) {aDate = date;}@Temporal(TemporalType.TIME)public Date getATime() {	return aTime;}public void setATime(Date time) {aTime = time;}@Temporal(TemporalType.TIMESTAMP)public Date getATimestamp() {	return aTimestamp;}public void setATimestamp(Date timestamp) {aTimestamp = timestamp;}...Usando Temporal Metadata
@Enumerated(EnumType.ORDINAL)public ColorTypegetColorId() {	return colorId;}public void setColorId(ColorTypecolorId) {this.colorId = colorId;}@Enumerated(EnumType.STRING)public ColorTypegetColorName() {	return colorName;}public void setColorName(ColorTypecolorName) {this.colorName = colorName;}    @Idpublic long getId() {	return id;}private void setId(long id) {	this.id = id;}//final of class}Usando Temporal Metadata
	Maneja el mapeo de O/R de las entidades a la base de datos.Provee API’s- Insertando objetos en la base de datos- Obteniendo objetos de la base de datos- Sincronizando objetos con la base de datos- Consultando de la base de datosProvee acceso en cachéSe coordina con servicios transaccionales del servidor (JTA)javax.persistence.EntityManager
	Es un juego de instancias de entidades administradas por un Entity ManagerTodas las entidades se vuelven “detached” una vez que han sido cerradas o eliminadasExisten 2 tipos- Contextos de Persistencia de alcance-transaccional	>> inicio/fin en los limites de la transacción- Contextos de Persistencia extendidos	>> vive mas que una transacción simple	>> permite interacciones más duraderas con la base de datosCONTEXTO DE PERSISTENCIA
Ejemplo de Contexto de Persistencia
	Es un juego de clases que están mapeadas a la base de datosDefinido en META-INF/persistence.xml Debe tener un identificador (name=“”)Las Clases - Pueden ser nombradas en el archivo “persistence.xml”- Pueden ser automáticamente escaneadas del proyectoUNIDAD DE PERSISTENCIA
	Son componentes que permiten interactuar con la base de datos y que residen en el servidor.A través del entity manager estos componentes pueden realizar operaciones de actualización sobre la base de datos.Debe tenerse en cuenta el tipo de transacción que está usando el contexto de presistencia para asegurar la coherencia de los datos.BEANS DE SESIÓN
persist()
find()
getReference()
createQuery()
merge()
remove()
refresh() y contains()
clear() y flush()
	Son componentes que actúan como proxies aplicando las reglas del negocio al delegar las tareas a los beans de sesión correspondientes.Es necesario realizar una serie de pasos para garantizar una conexión segura entre este componente y los beans de sesión.DELEGADOS
Paso 1Crear una clase con un nombre que cumpla con la siguiente nomenclatura:          “NombreEntidad”+DelegateCrear una propiedad del tipo de bean de sesión que nos permita trabajar con la entidad correspondiente.
Paso 2Hacer clic derecho sobre cualquier parte de la clase y seleccionar la opción “Insert Code…”.De preferencia, hacerlo dentro del cuerpo de la clase.
Paso 3En el menú emergente que aparece, seleccionar la opción “Call Enterprise Bean”.
Paso 4Aparecerá una ventana como la siguiente, en la cual buscaremos el bean de sesión con el cual queremos que nuestro Delegado tenga conexión.Luego de eso, sin modificar el campo “Reference Name”, hacemos clic en “OK”.
Paso 5Luego de cumplir el paso 4, automáticamente aparecerá este segmento de código.La función de este método es crear una conexión limpia entre el delegado y el servidor para obtener una instancia del bean de sesión.Es importante que este método se genere cumpliendo estos pasos. Sin embargo, esta tarea sólo se realiza una vez por proyecto web. Sí y solo si ya se ha generado por primera vez,  se puede copiar de una clase a otra.
Paso 6Ahora debemos crear un constructor que no reciba parámetros, pero que en el cuerpo se inicialice la variable “local” haciendo un llamado al método que se generó en el paso anterior. Tal como su muestra en la siguiente imagen.Es imprescindible que se realice este paso, ya que de no hacerlo la variable “local” siempre será null.
Paso 7El paso 5 tiene repercusión en el archivo web.xml. Como sabemos, este archivo describe los parámetros de despliegue y la configuración de la aplicación en el servidor.Por tal motivo, en la pestaña “Referencias” encontraremos nuestra referencia hacia el bean de sesión seleccionado.
Paso 8Podemos revisar el archivo web.xml en formato XML para darnos cuenta que los valores coinciden con nuestro método lookupPersonaFacade().
Paso 9Sólo para demostrar un ejemplo de lo que puede hacer un Delegado, crearemos un método público crear que reciba como un parámetro a una persona.Este método es susceptible a lanzar excepciones cuando hay un error en la comunicación con la base de datos o cuando incumple la regla: “DNI es único por persona”.Nótese que toda interacción con la base de datos el método delega la tarea al bean de sesión correspondiente.
3Resumen
WARInterfaces de UsuarioComponentes GUI PersonalizadosEAREJBWARRichfaces 3.xMy Faces 1.7Java MailArchivos de ConfiguraciónControladoresDelegadosutilitariosEntidades del NegocioSessionBeansSeguridadRESUMENEsta es la arquitectura de desarrollo que debemos respetar desde el inicio de la implementación hasta el despliegue de una aplicación empresarial.
Esta clase sólo ha tocado 3 capas de las 5 propuestas. ¿Cuales son estas 3 capas?GRACIAS
Encuentra esta presentación en elAULA VIRTUAL					O tambiénpuedesencontrarlaen                              . Saludos!

P2C2 Introducción a JEE5

  • 1.
    Aurelio Martín ObandoTávaraaot@upnorte.edu.peproyectos iiINTRODUCCIÓN A JEE5
  • 2.
  • 3.
    AGENDA API dePersistencia de JavaEntidadesBeans de SesiónDelegadosResumenClase 021
  • 4.
  • 5.
    El API dePersistencia de Java brinda facilidad al momento de interactuar con la base de datos y hacer el mapeo de objeto/relación respecto a un modelo de datos relacional en sus aplicaciones. JPAconsiste en 3 áres El API de Persistencia de Java. Mapeo de Objetos/Relaciones. El lenguaje Consultas. API de Persistencia de Java
  • 6.
    Una entidad esun 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.Formalmente y eventualmente llamados “Entity Beans”.Clases listadas en el elemento “<class>” en el archivo “persistence.xml”.No son persistentes hasta que están asociadas a un EntityManager.em.persist(author);ENTIDADES
  • 7.
  • 8.
    packagejava.examples.orm.core.annotated;importjavax.persistence.*; @EntitypublicclassBike {privatelongid;privateStringmake;privateStringmodel;privateintsize;publicBike() {}publicBike(long id) { this.id = id; }@IdpubliclonggetId() {returnid; }privatevoidsetId(long id) { this.id = id; }publicStringgetMake() {returnmake; }publicvoidsetMake(Stringmake) {this.make= make; } ...}Ejemplo de Entidad Anotada : Bike.java
  • 9.
    packagejava.examples.orm.core.mapped;publicclassBike {privatelong id;privateStringmake;privateStringmodel;privateintsize;publicBike(){}publicBike(long id) { this.id = id; }publiclonggetId() {return id; }privatevoidsetId(long id) { this.id = id; }publicStringgetMake() {returnmake; }publicvoidsetMake(Stringmake) {this.make = make; } ...}Ejemplo de Entidad No-Anotada: Bike.java
  • 10.
    Usado para determinarel nombre de la tabla automáticamenteBikeclassBiketable El nombre de la Tabla puede ser especificado sin tener relación con el nombre de la entidad@Table(name=”table_name”)Usado para referenciar a una clase a través de EJB-QLNombre de la Entidad
  • 11.
  • 12.
    create table CAR(CAR_ID bigint not null, CAR_YEAR integer not null, CAR_MODEL varchar(20) not null, CAR_MAKE varchar(20) not null, CAR_COST double, primary key (CAR_ID))Ejemplo de un esquema de BD a mapear
  • 13.
    package java.examples.orm.core.annotated;import javax.persistence.*;@Entity@Table(name="CAR")publicclass Car { private long id; private String make; private String model; private int year; private double cost; public Car() {} public Car(long id) { this.id = id; } @Id@Column(name="CAR_ID", nullable=false) public long getId() { return id; } private void setId(long id) { this.id = id; } …Mapeo a BD usando Anotaciones
  • 14.
    @Column(name="CAR_MAKE", unique=false, nullable=false,insertable=true, updatable=true, table="", //nota: podemosapuntar a otratablaparaobtener la propiedad length=20) public String getMake() { return make; } public void setMake(String make) {this.make = make; }@Column(name="CAR_MODEL", nullable=false, length=20) public String getModel() { return model; } public void setModel(String model) {this.model = model; } …Mapeo a BD usando Anotaciones
  • 15.
    @Column(name="CAR_YEAR", nullable=false) public intgetYear() { return year; } public void setYear(int year) {this.year = year; }@Column(name="CAR_COST", scale=7, precision=2) public double getCost() { return cost; } public void setCost(double cost) {this.cost = cost; } ...}Mapeo a BD usando Anotaciones
  • 16.
    Toda entidad debetener una llave primariaLlaves primarias deben ser únicasPuede mapearse a una (llave primaria simple) o más (llave primaria compuesta) propiedades Las propiedades deben ser de tipo- tipos primitivos Java (incluido: Integer, Long, etc.)- java.lang.String- Clases de tipo llave primaria (compuesta de tipos de propiedades adecuados)LAVES PRIMARIAS SIMPLES
  • 17.
    public interface javax.persistence.GeneratedValue{javax.persistence.GenerationType strategy(); String generator();}public final class javax.persistence.GenerationType extends java.lang.Enum{ public static final GenerationType TABLE; public static final GenerationType SEQUENCE; public static final GenerationType IDENTITY; public static final GenerationType AUTO;}Llaves Primarias generadas
  • 18.
  • 19.
    Transient- Le diceal proveedor de persistencia que ignore este campo/propiedadFetchType- Le dice a la persistencia el modo de carga de las relaciones de una objetoTemporal- Especifica detalle para el mapeo de propiedades tipo Date y CalendarLob- Mapea tipos BLOB y CLOBEnumerated- Mapea tipo Enumerado Java SE 5REFINAMIENTO DE MAPEO
  • 20.
  • 21.
  • 22.
    package java.examples.orm.core.annotated;import java.io.Serializable;importjavax.persistence.*;@Entity@Table(name=“UMBRELLA")public class Umbrella implements Serializable { private static final long serialVersionUID = 1L; private long id; private String make; private String model; public Umbrella() { } public Umbrella(long id) { this.id = id; } @Id public long getId() { return id; } private void setId(long id) { this.id = id; }@Lob @Basic(fetch=FetchType.LAZY) public char[] getMake() { return make.toCharArray(); } public void setMake(char[] make) { this.make = new String(make); }Ejemplo de Lob
  • 23.
  • 24.
    package java.examples.orm.core.annotated;import java.io.Serializable;importjava.util.Date;import javax.persistence.*;Import java.examples.orm.core.ColorType;@Entity@Table(name="VASE")public class Vase implements Serializable { private static final long serialVersionUID = 1L; private long id; private Date aDate; private Date aTime; private Date aTimestamp; private ColorTypecolorId; private ColorTypecolorName; public Vase() {} public Vase(long id) { this.id = id; } …Ejemplo con tipo Temporal y Enum
  • 25.
    @Temporal(TemporalType.DATE)public DategetADate() { return aDate;}public void setADate(Date date) {aDate = date;}@Temporal(TemporalType.TIME)public Date getATime() { return aTime;}public void setATime(Date time) {aTime = time;}@Temporal(TemporalType.TIMESTAMP)public Date getATimestamp() { return aTimestamp;}public void setATimestamp(Date timestamp) {aTimestamp = timestamp;}...Usando Temporal Metadata
  • 26.
    @Enumerated(EnumType.ORDINAL)public ColorTypegetColorId() { returncolorId;}public void setColorId(ColorTypecolorId) {this.colorId = colorId;}@Enumerated(EnumType.STRING)public ColorTypegetColorName() { return colorName;}public void setColorName(ColorTypecolorName) {this.colorName = colorName;} @Idpublic long getId() { return id;}private void setId(long id) { this.id = id;}//final of class}Usando Temporal Metadata
  • 27.
    Maneja el mapeode O/R de las entidades a la base de datos.Provee API’s- Insertando objetos en la base de datos- Obteniendo objetos de la base de datos- Sincronizando objetos con la base de datos- Consultando de la base de datosProvee acceso en cachéSe coordina con servicios transaccionales del servidor (JTA)javax.persistence.EntityManager
  • 28.
    Es un juegode instancias de entidades administradas por un Entity ManagerTodas las entidades se vuelven “detached” una vez que han sido cerradas o eliminadasExisten 2 tipos- Contextos de Persistencia de alcance-transaccional >> inicio/fin en los limites de la transacción- Contextos de Persistencia extendidos >> vive mas que una transacción simple >> permite interacciones más duraderas con la base de datosCONTEXTO DE PERSISTENCIA
  • 29.
    Ejemplo de Contextode Persistencia
  • 30.
    Es un juegode clases que están mapeadas a la base de datosDefinido en META-INF/persistence.xml Debe tener un identificador (name=“”)Las Clases - Pueden ser nombradas en el archivo “persistence.xml”- Pueden ser automáticamente escaneadas del proyectoUNIDAD DE PERSISTENCIA
  • 31.
    Son componentes quepermiten interactuar con la base de datos y que residen en el servidor.A través del entity manager estos componentes pueden realizar operaciones de actualización sobre la base de datos.Debe tenerse en cuenta el tipo de transacción que está usando el contexto de presistencia para asegurar la coherencia de los datos.BEANS DE SESIÓN
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
    Son componentes queactúan como proxies aplicando las reglas del negocio al delegar las tareas a los beans de sesión correspondientes.Es necesario realizar una serie de pasos para garantizar una conexión segura entre este componente y los beans de sesión.DELEGADOS
  • 41.
    Paso 1Crear unaclase con un nombre que cumpla con la siguiente nomenclatura: “NombreEntidad”+DelegateCrear una propiedad del tipo de bean de sesión que nos permita trabajar con la entidad correspondiente.
  • 42.
    Paso 2Hacer clicderecho sobre cualquier parte de la clase y seleccionar la opción “Insert Code…”.De preferencia, hacerlo dentro del cuerpo de la clase.
  • 43.
    Paso 3En elmenú emergente que aparece, seleccionar la opción “Call Enterprise Bean”.
  • 44.
    Paso 4Aparecerá unaventana como la siguiente, en la cual buscaremos el bean de sesión con el cual queremos que nuestro Delegado tenga conexión.Luego de eso, sin modificar el campo “Reference Name”, hacemos clic en “OK”.
  • 45.
    Paso 5Luego decumplir el paso 4, automáticamente aparecerá este segmento de código.La función de este método es crear una conexión limpia entre el delegado y el servidor para obtener una instancia del bean de sesión.Es importante que este método se genere cumpliendo estos pasos. Sin embargo, esta tarea sólo se realiza una vez por proyecto web. Sí y solo si ya se ha generado por primera vez, se puede copiar de una clase a otra.
  • 46.
    Paso 6Ahora debemoscrear un constructor que no reciba parámetros, pero que en el cuerpo se inicialice la variable “local” haciendo un llamado al método que se generó en el paso anterior. Tal como su muestra en la siguiente imagen.Es imprescindible que se realice este paso, ya que de no hacerlo la variable “local” siempre será null.
  • 47.
    Paso 7El paso5 tiene repercusión en el archivo web.xml. Como sabemos, este archivo describe los parámetros de despliegue y la configuración de la aplicación en el servidor.Por tal motivo, en la pestaña “Referencias” encontraremos nuestra referencia hacia el bean de sesión seleccionado.
  • 48.
    Paso 8Podemos revisarel archivo web.xml en formato XML para darnos cuenta que los valores coinciden con nuestro método lookupPersonaFacade().
  • 49.
    Paso 9Sólo parademostrar un ejemplo de lo que puede hacer un Delegado, crearemos un método público crear que reciba como un parámetro a una persona.Este método es susceptible a lanzar excepciones cuando hay un error en la comunicación con la base de datos o cuando incumple la regla: “DNI es único por persona”.Nótese que toda interacción con la base de datos el método delega la tarea al bean de sesión correspondiente.
  • 50.
  • 51.
    WARInterfaces de UsuarioComponentesGUI PersonalizadosEAREJBWARRichfaces 3.xMy Faces 1.7Java MailArchivos de ConfiguraciónControladoresDelegadosutilitariosEntidades del NegocioSessionBeansSeguridadRESUMENEsta es la arquitectura de desarrollo que debemos respetar desde el inicio de la implementación hasta el despliegue de una aplicación empresarial.
  • 52.
    Esta clase sóloha tocado 3 capas de las 5 propuestas. ¿Cuales son estas 3 capas?GRACIAS
  • 53.
    Encuentra esta presentaciónen elAULA VIRTUAL O tambiénpuedesencontrarlaen . Saludos!

Notas del editor