Está en la página 1de 57

Arquitectura de Aplicaciones

Empresariales en Java

Relator: Juan Claudio Navarro


jcnavarro@optimisa.cl, jnavarro@dcc.uchile.cl,
juancla.navarro@gmail.com

Agenda
n

Bloque 1 (18:30 20:00)


n
n
n

Java EE
La capa de presentacin
La capa de negocio

Bloque 2 (20:30 21:30)


n
n

La capa de datos
Discusin

JAVA EE

Aplicaciones Empresariales
n

Las aplicaciones empresariales suelen


presentar algunos de los siguientes
requerimientos
Interaccin con diversas fuentes de datos
n Interaccin con otros sistemas (actuales
y/o legados)
n Acceso Web
n Concurrencia
n Alta carga de procesamiento
n Usuarios con diferentes perfiles
n Requerimientos de seguridad
n

Java Platform, Enterprise Edition


n

Java EE es la plataforma de Java para el desarrollo


de aplicaciones en el servidor (anteriormente llamada
J2EE: Java 2, Enterprise Edition)
Provee un ambiente de ejecucin y un conjunto de
APIs: Servlets, JSP, JSF, EJB, JMS, JDBC, JPA, JNDI,
JavaMail, JAXB, JAXP, JAX-WS, etc.

Beneficios de Java EE
n
n
n
n
n
n
n

Transparencia de la ubicacin
Visin OO de la base de datos
Manejo transaccional
Pools de recursos
Seguridad
Alta disponibilidad
Portabilidad

Contenedores Java EE
n

La especificacin Java EE define dos


contenedores:
n
n

Web Container
EJB Container

Estos contenedores son los responsables de


manejar los componentes correspondientes

Servidores Java EE
Servidor

Proveedor

Tipo

Weblogic Server

Oracle (antes BEA)

comercial

WebSphere
Application Server

IBM

comercial

Tomcat

Apache

libre

Slo Web Container

JBoss Application
Server

Red Hat (antes JBoss) libre

EJB Container, se
integra con Tomcat

GlassFish

Oracle (antes Sun)

libre

JOnAS

OW2 Consortium

libre

Notas

EJB Container, se
integra con Tomcat

Lista de servidores en
http://en.wikipedia.org/wiki/Comparison_of_application_servers
Anlisis de Gartner sobre servidores de aplicaciones:
http://www.gartner.com/technology/reprints.do?
id=1-17GUO5Z&ct=110928&st=sb
8

Servlets
JSP JavaServer Pages
JSF JavaServer Faces
Otras tecnologas: ZK

LA CAPA DE PRESENTACION

La Capa Web
n

La operacin de la capa Web es soportada por el


contenedor Web
n
n

Maneja la interaccin con el cliente (protocolo HTTP(S))


Reenva cada requerimiento HTTP al componente Web que
corresponda, entregndole los parmetros necesarios para
que ste pueda realizar su tarea
Maneja sesiones, filtros, eventos, seguridad, etc.

10

Servlets
n

El contenedor Web maneja la interaccin con los


clientes Web (browsers), y delega los requerimientos
dinmicos a componentes Web (servlets y pginas
JSP)
Un servlet es una clase Java que es instanciada e
invocada por el contenedor Web, en respuesta a
requerimientos HTTP

11

Servlets
n

Tareas que puede realizar un servlet


n

n
n

Leer data enviada por el usuario (por ejemplo a travs


de un Form de una pgina Web)
Obtener otra informacin del requerimiento (browser
utilizado, cookies, direccin IP cliente, etc.)
Generar el resultado
Formatear el resultado en un documento (tpicamente
una pgina HTML)
Establecer parmetros de respuesta (tipo de
documento retornado, cookies, etc.)
Enviar la respuesta al cliente (formato text/html,
image/gif, etc.)

12

Servlets - un Ejemplo Sencillo


ServletHolaMundo.java

WEB-INF/web.xml

public class ServletHolaMundo extends HttpServlet


{
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hola, mundo!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hola, mundo!</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
}

<servlet>
<servlet-name>ServletHolaMundo
</servlet-name>
<servlet-class>cl.servlets.ServletHolaMundo
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHolaMundo
</servlet-name>
<url-pattern>/holamundo
</url-pattern>
</servlet-mapping>

13

Limitaciones de Servlets
n

Con Servlets, es fcil:


n
n
n

Leer parmetros y form data


Manejar cookies y sesiones
Manejar HTTP: request/response headers, cdigos
de estado
Compartir datos entre servlets

Pero no resulta cmodo:


n
n

Usar sentencias println para generar HTML


Mantener el cdigo HTML

14

JSP JavaServer Pages


n
n

La tecnologa JSP facilita la construccin de aplicaciones Web dinmicas


Una pgina JSP (JavaServer Pages) es un documento de texto que
incluye dos tipos de texto:
n

Texto esttico (template data), que puede ser expresado en cualquier


formato basado en texto (HTML, XML, WML, etc.)
Elementos JSP, que construyen contenido dinmico

Pgina JSP

Pgina HTML generada en


request time y enviada al cliente

Pgina HTML
desplegada
en el browser

15

Pginas JSP
n

El contenedor Web genera un servlet a partir


de una pgina JSP
Elementos JSP al interior de una pgina
n

Elementos de scripting
n
n
n

n
n

Scriptlets: <% cdigo Java %>


Expresiones Java: <%= expresin Java %>
Declaraciones: <%! declaraciones Java %>

Expression Language: ${ expresin }


Otros: directivas, custom tags, etc.

Objetos predefinidos en una pgina JSP:


request, response, out, session, application,
exception
16

JSF JavaServer Faces


n

JSF es el framework para la capa de presentacin


provisto por Java EE
JSF provee una arquitectura para manejar el estado
de componentes, procesamiento de informacin,
validacin de informacin ingresada por el usuario,
atencin de eventos, y navegacin entre pginas
JSF separa la lgica de presentacin y de aplicacin,
facilitando la conexin entre las correspondientes
capas

17

JSF Eventos y Navegacin


Pgina JSP

Managed
bean

Flujo de
navegacin
(facesconfig.xml)

...
<h:inputText value="#{algoritmoBean.iteraciones}"/>
<h:commandButton value="Calcular" action="#{algoritmoBean.calcular}"/>
public class Algoritmo {
private int iteraciones = 10;
public int getIteraciones() { return iteraciones; }
public int setIteraciones(int n) { iteraciones = n; }
public String calcular() { for (int i=0; i<iteraciones; i++) {}; return "ok"; }
}

evento

outcome

<managed-bean>
<managed-bean-name>algoritmoBean</managed-bean-name>
<managed-bean-class>modelo.algoritmos.Algoritmo</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>algoritmo.jspx</from-view-id>
<navigation-case>
<from-outcome>ok</from-outcome>
<to-view-id>home.jspx</to-view-id>
</navigation-case>
</navigation-rule>
18

ZK http://www.zkoss.org
n

ZK Framework permite construir Rich Internet


Applications (RIA) haciendo uso de Ajax de manera
transparente para el programador

19

ZK Spreadsheet Demo

20

EJB Enterprise JavaBeans


Session Beans
Message-Driven Beans
Otras tecnologas: Spring

LA CAPA DE NEGOCIO

21

EJB - Enterprise JavaBeans


n

Un Enterprise JavaBean es un componente que opera en el


servidor, y que encapsula lgica de negocio de una aplicacin
La tecnologa de EJBs provee servicios de nivel de sistema
(distribucin, transacciones, pools de objetos, ), permitiendo
que el programador se concentre en la lgica de negocio
La especificacin de EJB 3 (mayo 2006) incorpor el uso de
anotaciones e inyeccin de dependencias, simplificando el
desarrollo

22

Tipos de EJB
n

Existen 2 tipos de EJB


n
n

Session Beans
Message-Driven Beans (MDB)
Session Bean

Message-Driven
Bean

Invocacin

Sincrnica

Asincrnica: el cliente
enva un mensaje JMS
a una cola, y el
servidor invoca al MDB
de manera asncrona
para procesar el
mensaje

Interfaz

Local y/o remota

No requiere, el cliente
no invoca al MDB

23

Session Beans
n

n
n

Un session bean representa una sesin de trabajo de un cliente


al interior del servidor de aplicaciones
El cliente invoca sincrnicamente los mtodos del bean
No hay concurrencia en session beans: si varios clientes
ejecutan simultneamente operaciones de un mismo session
bean, cada uno de ellos opera con una instancia diferente del
bean
Dos tipos de session beans:
n

Stateless (SLSB):
n
n
n

No mantiene estado conversacional para el cliente


El servidor crea un pool de instancias para cada SLSB
Cuando un cliente invoca un mtodo de un SLSB, el servidor escoge
una instancia del pool para atender el requerimiento, y luego la
instancia vuelve al pool

Stateful (SFSB):
n
n

Mantiene estado conversacional en variables de instancia


Una instancia de un stateful session bean pertenece a un cliente, y
permanece asociado a l hasta que se da por terminada la sesin
24

Elementos de un Session Bean


n

Un session bean se define mediante:


n
n

La interfaz de negocio (business interface)


La clase de implementacin, que implementa la interfaz de
negocio

La interfaz de negocio puede ser:


n

Local: utilizada por clientes locales (que se ejecutan en la


misma instancia del servidor de aplicaciones), con semntica
Java
Remote: utilizada por clientes Java remotos que interactan
con el bean mediante RMI

25

Objetos Remotos
n

EJB utiliza RMI (Remote Method Invocation) para la


invocacin de objetos remotos
El cliente invoca un stub (proxy del objeto remoto, en el
cliente)
El stub invoca al skeleton
a travs de la red (proxy del
objeto remoto, en el servidor)
El skeleton invoca al objeto
remoto
El stub y el objeto remoto
implementan la misma
interfaz, por lo que el cliente
opera como si interactuara
directamente con el objeto remoto

26

Un Session Bean
n

ServicioFacturas.java
package cl.sii.facturaelectronica;

Interfaz de negocio
La anotacin @Local indica que el bean
soporta acceso local
La anotacin @Remote indica que el bean
soporta acceso remoto

@Local
public interface ServicioFacturas {
boolean valida(Factura factura);
}

ServicioFacturasBean.java

package cl.sii.facturaelectronica;

Clase de implementacin
Las anotaciones @Stateless y @Stateful
indican que se trata de un session bean

@Stateless
public class ServicioFacturasBean implements ServicioFacturas {
@Override
public boolean valida(Factura factura) {
...
}
}
27

Un Cliente Local
n

En un componente de una aplicacin Java EE (un


servlet, un EJB, etc.), la anotacin @EJB inyecta la
interfaz de negocio
FacturaServlet.java
...
import javax.ejb.EJB;
...
public class FacturaServlet extends HttpServlet {
@EJB private ServicioFacturas ejb;
...
private void procesar(Factura factura) {
if (ejb.valida(factura)) {
...
}
}
}

28

Un Cliente Remoto (WebLogic)


n

Los clientes remotos utilizan JNDI para acceder a


session beans

ClienteServicioFacturas.java
...
public class ClienteServicioFacturas {
public void valida(Factura factura) throws NamingException {
// Obtenemos el contexto inicial
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, "t3://facturas.sii.cl:7001");
Context context = new InitialContext(properties);
// Obtenemos una referencia a un EJB y lo utilizamos
ServicioFacturasRemote ejb = (ServicioFacturasRemote)
context.lookup("FacturaApp/ServicioFacturas/remote");
if (ejb.valida(factura)) {
...
}
}
}
29

Interfaces Locales v/s Remotas


n

Las invocaciones remotas (diferentes procesos) son


mucho ms caras que las locales
Lo anterior se acenta si los procesos se encuentran
en mquinas diferentes
Por lo tanto, las interfaces remotas deben disearse
de modo de minimizar las invocaciones
Recomendaciones de Martin Fowler (Patterns of
Enterprise Application Architecture)
n

Primera ley de Diseo de Objetos Distribuidos: no distribuya


sus objetos J
En general, para hacer uso de varios nodos utilice clustering:
replique los procesos completos
Es frecuente realizar una separacin fsica entre la capa Web
y la capa de negocio, en este caso preocpese de minimizar
la interaccin entre las capas
30

Message-Driven Beans (MDB)


n

Un message-driven bean permite atender requerimientos


asincrnicos en la plataforma Java EE
A diferencia de session beans, los MDB no poseen interfaces de
negocio, debido a que los clientes no manejan referencias al
bean
En lugar de ello, los clientes envan mensajes a sistemas de
mensajera (Websphere MQ, etc.), y stos son atendidos por
objetos MDB
No hay concurrencia en objetos MDB: si se procesan
simultneamente mensajes de un mismo destino, cada uno de
ellos es procesado por una instancia diferente del bean

31

Un Cliente JMS
n

El siguiente cdigo enva un mensaje JMS a una cola,


utilizando JNDI para acceder a los recursos
// Inicio de una sesin JMS
ConnectionFactory factory = (ConnectionFactory) context.lookup("jms/QCF");
Connection connection = factory.createConnection();
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// Creacin de un MessageProducer asociado a un destino
Destination destination = (Destination) context.lookup("jms/QProcesos");
MessageProducer producer = session.createProducer(destination);
// Envo del mensaje
producer.send(session.createObjectMessage(object));
session.commit();
// Cierre de la conexin
connection.close();

32

Un Message-Driven Bean
n
n

El mtodo onMessage() procesa el mensaje


Si se produce un commit en la transaccin, el mensaje es
consumido (es eliminado del destino)
Si se produce un rollback en la transaccin, el mensaje no es
consumido (permanece en el destino)
@MessageDriven(
messageListenerInterface=MessageListener.class,
activationConfig = {
@ActivationConfigProperty(
propertyName="connectionFactoryJndiName", propertyValue="jms/QCF"),
@ActivationConfigProperty(
propertyName="destinationName", propertyValue="jms/QProcesos"),
@ActivationConfigProperty(
propertyName="destinationType", propertyValue="javax.jms.Queue")
})
public class QProcesosBean implements MessageListener {
public void onMessage(Message message) {
...
}
}
33

Una Alternativa a EJB: Spring


n

Spring (http://www.springsource.com/developer/spring) es un
framework que, entre otras cosas, entrega algunas de las
funcionalidades provistas por EJBs (transacciones, integracin
con JPA, acceso remoto, etc.), sin requerir el uso de ellos
La ventaja de no usar EJB es que se simplifican las pruebas:
Spring se integra de manera natural con JUnit
Spring opera sobre un contenedor de Inversin de Control, que
permite configurar el cableado de componentes Java: los
objetos se conocen entre s mediante interfaces; Spring
instancia los objetos que implementan las interfaces a partir de
la configuracin, y establece las referencias entre objetos
Los objetos manejados por Spring pueden tener los siguientes
scopes:
n
n
n
n
n

Singleton (default)
Prototype (se crea un nuevo objeto cada vez que se solicita uno)
Session
Request
Desktop (en ZK, corresponde a las pginas de un requerimiento)

34

Transacciones
JPA Java Persistence API

LA CAPA DE DATOS

35

Transacciones
n

La tecnologa EJB provee Container-Managed


Transactions
En la figura, method-A inicia una transaccin, y al
interior de ella invoca a method-B
El mtodo method-B, se ejecutar en la misma
transaccin o en una nueva?
La respuesta a la pregunta anterior est dada por el
atributo transaccional de method-B

36

Atributos Transaccionales
Atributo

Descripcin

Required
(default)

Si el cliente se ejecuta en una transaccin, se usa esa transaccin. De


lo contrario, se inicia una transaccin nueva.

RequiresNew

Se inicia una transaccin nueva. Si el cliente se ejecuta en una


transaccin, sta es suspendida y retomada al finalizar el mtodo
invocado.

Mandatory

El mtodo se ejecuta en la transaccin del cliente. Si no hay una


transaccin en el cliente, se genera una excepcin
TransactionRequiredException.

NotSupported

El mtodo es invocado con un contexto transaccional no especificado.


Si el cliente se ejecuta en una transaccin, sta es suspendida y
retomada al finalizar el mtodo invocado.

Supports

Se ejecuta en la transaccin del cliente si sta existe (Required), de lo


contrario el mtodo es invocado con un contexto transaccional no
especificado (NotSupported).

Never

Si el cliente se ejecuta en una transaccin, se genera una excepcin


EJBException.
37

Especificacin de Atributos
n

La anotacin @TransactionAttribute permite


establecer un atributo transaccional diferente del
default REQUIRED
@Stateless
public class TestFacturasBean implements TestFacturas {
@PersistenceContext
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void creaFactura() {
Factura factura = new Factura();
...
em.persist(factura);
}
}

38

Alcance de una Transaccin


n

Usando Container-Managed Transaction


Demarcation, las transacciones son iniciadas por el
servidor en funcin del atributo transaccional del
mtodo invocado
La transaccin es finalizada por el servidor cuando
termina el mtodo cuya invocacin caus el inicio de
la transaccin
El contenedor cancela la transaccin (Rollback) si:
n

n
n

Durante la ejecucin del mtodo se ha invocado al mtodo


EJBContext.setRollbackOnly()
La ejecucin del mtodo genera una excepcin de sistema
La ejecucin del mtodo genera una excepcin de aplicacin
declarada @ApplicationException(rollback=true)

En caso contrario, la transaccin es aceptada


(Commit)

39

Transacciones Distribuidas
n

El servidor Java EE provee soporte para el manejo de


transacciones distribuidas (operaciones con diferentes RDBMS, y
desde diferentes servidores Java EE, en una nica transaccin)
Si se utiliza Container-Managed Transaction Demarcation, el
servidor Java EE maneja automticamente el protocolo twophase commit en la interaccin con las bases de datos (para lo
cual los drivers deben soportar el protocolo XA)

Transaccin incluye 3 RDBMS


40

Integracin con JMS


n

El uso de mensajera se integra de


manera natural con el modelo
transaccional de Java EE
En el primer ejemplo, el EJB X enva
un mensaje a la cola A, y modifica la
base de datos B, y finalmente el EJB Y
modifica la base de datos C, todo ello
en una misma transaccin
En el segundo ejemplo, la transaccin
realizada por el EJB X incluye el
consumo de un mensaje de la cola A,
y la actualizacin de las bases de
datos B y C
41

JPA Java Persistence API


n

JPA es el framework de persistencia de Java


EE
Provee un mecanismo de mapeo objetorelacional que permite al programador Java
utilizar un modelo de dominio para
interactuar con una base de datos relacional
Principales proveedores de persistencia:
Hibernate, TopLink, Kodo, Apache OpenJPA
Beneficios: simplicidad, productividad,
mantenibilidad

42

Caractersticas JPA
n
n
n
n
n
n
n

Modelo de persistencia basado en POJOs


Entidades pueden ser serializables
Herencia
Polimorfismo
Mapeo va anotaciones o XML
Soporte de Java EE y Java SE
Proveedores de persistencia pluggables

43

Entidades
n

n
n
n

n
n
n
n
n

Una entidad es una clase persistente, liviana, del


modelo de dominio
Puede ser una clase concreta o abstracta
Se mapea a una tabla
Sus campos o propiedades se mapean a columnas de
la tabla
Tiene un identificador persistente
Puede tener estado persistente y transiente
Soporta herencia y polimorfismo
Puede ser serializable
Las asociaciones entre entidades se manejan a travs
de referencias y colecciones

44

Entidades
n

n
n

n
n

La anotacin @Table permite definir el nombre de la tabla (puede omitirse si la


tabla se llama igual que la clase)
El mapeo de columnas puede realizarse sobre campos o propiedades
La anotacin @Column permite definir el nombre de la columna (puede omitirse
si la columna se llama igual que el campo/propiedad)
La anotacin @Id permite indicar que la columna corresponde a la llave primaria
Las anotaciones @GeneratedValue y @SequenceGenerator permiten indicar el
uso de una secuencia

@Entity
@Table(name="EMPRESAS")
public class Empresa {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_EMP_G")
@SequenceGenerator(name="SEQ_EMP_G", sequenceName="SEQ_EMP", allocationSize=1)
private long id;
EMPRESAS

private String rut;

ID

RUT

RAZON_SOCIAL

@Column(name="RAZON_SOCIAL")
private String razonSocial;

77.234.556-2

Restorn El Poroto S.A.

89.188.652-4

Librera Macondo

45

Asociaciones
n
n

Pueden ser unidireccionales o bidireccionales


Es posible definir asociaciones:
n
n
n
n

1-1: @OneToOne
1-n: @OneToMany
n-1: @ManyToOne
n-n: @ManyToMany

Se implementan mediante referencias y la librera de


colecciones de Java: Collection, List, Set, Map
Se puede definir la propagacin de operaciones en
cascada:
n
n
n
n
n

PERSIST
REMOVE
MERGE
REFRESH
ALL
46

Asociacin @ManyToOne
n

La anotacin @ManyToOne indica que el campo/propiedad es


una referencia a una instancia de otra entidad
La anotacin @JoinColumn permite indicar los nombres de las
columnas que definen la asociacin
EMPLEADOS
ID

RUT

NOMBRE

ID_EMPR

@Entity
@Table(name="EMPLEADOS")
1
9.345.222-4
Carlos Rojas
2
public class Empleado {
8
8.336.235-6
Daniela Merino
2
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_EMPL_G")
@SequenceGenerator(name="SEQ_EMPL_G", sequenceName="SEQ_EMPL", allocationSize=1)
private long id;
private String rut;
private String nombre;
@ManyToOne
@JoinColumn(name="ID_EMPR", referencedColumnName="ID")
private Empresa empresa;
}

47

Asociacin @OneToMany
n

La anotacin @OneToMany indica que el campo/


propiedad es una coleccin de instancias (Set, List)
de otra entidad
El atributo mappedBy indica el nombre del campo/
propiedad en la otra entidad de la asociacin
@Entity
@Table(name="EMPRESAS")
public class Empresa {
...
@OneToMany(mappedBy="empresa")
private Set<Empleado> empleados;
}

48

Herencia
n

Una entidad puede extender:


Una entidad abstracta o concreta
n Una clase (no entidad) abstracta o
concreta
n

JPA soporta 3 estrategias de herencia:


SINGLE_TABLE: una tabla para la jerarqua
n JOINED: una tabla para cada entidad
(abstracta o concreta) de la jerarqua
n TABLE_PER_CLASS (opcional): una tabla
para cada clase concreta
n

49

Herencia SINGLE_TABLE
@Entity
@Table(name="PERSONA")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TIPO",
discriminatorType=DiscriminatorType.STRING, length=2)
public abstract class Persona {
@Id private long id;
private String rut;
}
@Entity
@DiscriminatorValue(value="PN")
public class PersonaNatural extends Persona {
private String nombre;
}
@Entity
@DiscriminatorValue(value="PJ")
public class PersonaJuridica extends Persona {
@Column(name="RAZON_SOCIAL")
private String razonSocial;
}

50

Herencia JOINED
@Entity
@Table(name="PERSONA")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Persona {
@Id
private long id;
private String rut;
}
@Entity
@Table(name="PERSONA_NATURAL")
public class PersonaNatural extends Persona {
private String nombre;
}
@Entity
@Table(name="PERSONA_JURIDICA")
public class PersonaJuridica extends Persona {
@Column(name="RAZON_SOCIAL")
private String razonSocial;
}

51

Herencia TABLE_PER_CLASS
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Persona {
@Id
private long id;
private String rut;
}
@Entity
@Table(name="PERSONA_NATURAL")
public class PersonaNatural extends Persona {
private String nombre;
}
@Entity
@Table(name="PERSONA_JURIDICA")
public class PersonaJuridica extends Persona {
@Column(name="RAZON_SOCIAL")
private String razonSocial;
}
52

Uso de JPA
n

La interfaz EntityManager es la fachada de JPA hacia


el programador
La anotacin @PersistenceContext inyecta el Entity
Manager
@Stateless
public class TestFacturasBean implements TestFacturas {
@PersistenceContext
private EntityManager em;
public void creaFactura() {
// creamos una factura y establecemos su data
Factura factura = new Factura();
factura.setFecha(...);
...
// agregamos lineas a la factura
factura.addLinea("computadores", 10000000);
factura.addLinea("impresoras", 600000);
...
// grabamos la factura y las lneas en la base de datos
em.persist(factura);
}
}

53

Operaciones sobre Entidades


n

El Entity Manager provee las siguiente operaciones:


persist()

Inserta una instancia en la base de datos

remove()

Elimina una instancia de la base de datos

refresh()

Recarga el estado de una instancia de la base de


datos

merge()

Sincroniza el estado de una instancia detached con


el contexto de persistencia

find()

Ejecuta un query por llave primaria

createQuery()

Crea una instancia de un query usando JPA QL


dinmico

createNamedQuery()

Crea una instancia de un query predefinido

createNativeQuery()

Crea una instancia de un query a partir de una


consulta SQL

contains()

Determina si una entidad pertenece a un contexto


de persistencia

flush()

Fuerza la sincronizacin del contexto de persistencia


con la base de datos
54

Queries
n

n
n
n
n
n
n

JPA provee un lenguaje de consultas llamado Java


Persistence Query Language
Soporta queries dinmicas y estticas (named)
Soporta binding de parmetros y paginacin
Similar a SQL, maneja agregaciones y funciones
Soporta polimorfismo
Estandariza el acceso a diferentes bases de datos
Puede usar SQL
List<Factura> findFacturasCliente(Long idCliente) {
Query q = em.createQuery(
"select f from Factura f where f.empresa.id = :idEmpresa order by f.fecha");
q.setParameter("idEmpresa", idEmpresa);
q.setFirstResult(20);
q.setMaxResults(10);
return (List<Factura>) q.getResultList();
}

55

Funcionalidades Query Language


n

Inner joins
n

Outer joins
n

select o.id, sum(li.amount) from Order o join o.lineItems li


group by o.id

Funciones
n

select o from Order o where exists(


select li from o.lineItems li where li.amount > 100)

Agregacin
n

select o from Order o left join o.lineItems li where li.amount > 100

Subselects
n

select o from Order o join o.lineItems li where li.amount > 100

trim(), concat(), substring(), lower(), upper(), length(), abs(),


sqrt(), mod(), size()

Delete y update
n
n

delete from Customer cust where cust.id = 12345


update OrderLine ol set ol.fulfilled = 'Y' where ol.order.id = 987654

56

DISCUSION / PREGUNTAS

57