Download EJB 3.0 - New Technologies
Document related concepts
no text concepts found
Transcript
de Tales from TheServerSide.com Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs Historia y evolución Problemática La elección pragmática • EJB 3.0 Evolución de los EJBs Tour por EJB 3.0 Ejemplos • ¿Qué dirección tomar? • Conclusiones Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs Historia y evolución Problemática La elección pragmática • EJB 3.0 Evolución de los EJBs Tour por EJB 3.0 Ejemplos • ¿Qué dirección tomar? • Conclusiones Componentes J2EE Framework de productividad J2EE Presentación Infraestructura • Apache JSP, Strut, JSF, Ajax, Build Flex, GWT, Swing • Ant • Maven • Tomcat • JBoss • Weblogic • Websphere Middleware EJBs (CMP, MDB, Session, …) Hibernate, Kodo, Spring, Jakarta Commons • Oracle AS • AspectJ •… • Eclipse / IDE’s • APT / XDoclets • JUnit • OpenSTA • Log4J Base de Datos Oracle, DB2, SAP DB, SQL Server, MySQL, HSQLDB, PostgreSQL • CVS/SVN •… Componentes J2EE Framework de productividad J2EE: Build • Sistema de build Ant sigue siendo imbatible Maven • IDE Eclipse y plugins Intellij IDEA ($), BEA Workshop, NetBeans, JBuilder ($) • Calidad JUnit (Frameworks XUnit), JMeter, OpenSTA, LoadRunner ($) CheckStyle, JDepend, PMD SVN, CVS, ClearCase ($) Quest JProbe ($), Borland OptimizeIt ($) Componentes J2EE Framework de productividad J2EE: Presentación • Framework MVC Struts, Struts Tiles (documentación, experiencia, …) Tapestry, JSF, Flex, GWT, Seam, etc: menor experiencia de Tales from TheServerSide.com • Cliente pesado Swing Java Web Start … Componentes J2EE Framework de productividad J2EE: Middleware • Persistencia EJB, JDO, TopLink, Hibernate, Kodo • Integración de los componentes Spring, HiveMind, Jakarta Commons • Infraestructura Weblogic, Webphere, Oracle 9i AS, JBoss, Tomcat • Supervisión de la programación por aspectos (AOP) Seguridad, auditoria, log Spring, AspectJ Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs Historia y evolución Problemática La elección pragmática • EJB 3.0 Evolución de los EJBs Tour por EJB 3.0 Ejemplos • ¿Qué dirección tomar? • Conclusiones J2EE y los EJBs WEB Browser JSP Servlet EIS Business Componentes JavaBeans (Opcional) Entity Beans Session Beans MD Beans Base de Datos Client Servidor J2EE • Session Beans : conversación, lógica de negocio • Entity Beans : persistencia • Message Driven Beans : Session Bean + JMS J2EE y los EJBs J2EE != EJB • Los EJB fueron vendidos como la solución a todos los problemas. • Basado más sobre especificaciones que sobre experiencia (EJB 2.1, 646 páginas) implementar una arquitectura distribuida que sobre su utilización • Gartner Group afirmó que desde el 2003, se han gastado 2 billones de dólares innecesariamente en application servers • Después de muchos años, fuerte reacción anti-EJB J2EE y los EJBs Servicios • El application server provee: Connection pooling Soporte Transaccional Thread pooling Clustering, load balance, high availability • El container EJB provee: Transacciones declarativas (CMT) Seguridad declarativa Business Object pooling ! J2EE y los EJBs EJBs : Los problemas • Es muy ‘engorroso’ Intrusivo: javax.ejb, interfaces, callback methods Combinación de checked / unchecked exceptions JNDI lookups Chequeo semántico al momento de deploy • Infierno de METADATA XML Complejo de sincronizar Faltan defaults útiles • Entity Beans La implementación local no puede ser devuelta al cliente No tiene estrategias de mapeo para herencia No son polimórficos EJB-QL/finders en la práctica, muy limitante J2EE y los EJBs EJBs : Los problemas EJB public class CustomerBean extends EntityBean EJBLocalObject { public interface Customer implements EJBLocalObject public abstract long getId(); … … } } public interface CustomerHome long getId(); implements EJBLocalHome setId(longEJBObject id(; { public interface CustomerRemote … … implements EJBObject Desing Patterns • Productividad ?? • WORA ?? • Fácil de Testear ?? • Diseño restringido ?? ServiceLocator DTO Bussines Delegate etc … Mantenimiento EJBLocalHome { public abstrac setId(… Sincronización } EJBHome { } public interface long getId(); CustomerRemoteHome implements ejb-jar.xml EJBHome setId(long id(; <ejb-jar> { … weblogic-rdbms-ejb-jar.xml <enterprise-beans> … <weblogic-rdbms-jar> <entity> } <weblogic-rdbms-bean> <ejb-name>Customer</ejb-name> <ejb-name>Customer</ejb-name> <local-home>CustomerHome</localweblogic-ejb-jar.xml home> <data-sourcename>java:/dataSource</data<weblogic-enterprise-bean> <local>Customer</local> source-name> <ejb-name>Customer</ejb-name> <ejb-class>CustomerBean</ejb<table-name>CUSTOMER</table-name> class> <jndi-name>Customer</jndi<field-map> name> …. <cmp-field>id</cmp-field> </weblogic-enterprise-bean> <dbms-column>ID</dbms-column>…. / Generadores J2EE y los EJBs EJBs desde un punto de vista pragmático: • Stateless Session Beans • Container Managed Transactions (JTA) • Message Driven Beans (MDBs) • Utilización de POJOs (JavaBeans) • Persistencia con framework no EJB (ORM) J2EE y los EJBs Evolución de la plataforma J2EE • Experiencia acumulada en el desarrollo de aplicaciones J2EE • Un conjunto de tecnologías y frameworks, modificados considerablemente resultaron en: AOP Hibernate, JDO, … Framework IoC: Spring, HiveMind, … TDD • Dejan al descubierto los problemas de desarrollar con EJB, y son las premisas de un ‘otro’ modo de desarrollar aplicaciones J2EE de Tales from TheServerSide.com J2EE y los EJBs EJB : Pequeña historia • Marzo 1998: EJB 1.0 • Noviembre 1999: EJB 1.1 deployment descriptors, seguridad, entity beans,… • Agosto 2001: EJB 2.0 Local interfaces, relationships, EJB-QL, MDBs… • Noviembre 2003 : EJB 2.1 (JSR-153) EJB-QL (order by, avg, max, min, sum, count), EJB Timer service… • Junio 2004: EJB 3.0 Early Draft (JSR-220) • Mayo 2006: EJB 3.0 Final Release (JSR-220) Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs Historia y evolución Problemática La elección pragmática • EJB 3.0 Evolución de los EJBs Tour por EJB 3.0 Ejemplos •¿Qué dirección tomar? • Conclusiones EJB 3.0 Horizonte • JSR-175 (Java 1.5), anotaciones pueden reemplazar deployment descriptors • Compatibilidad ascendente EJB 2.x no está ‘deprecado’ Hay un asentimiento de las falencias no reconocidas. • Persistencia tipo ORM Especificacion separada (JPA) Ventaja para los que ya tengan un producto (JBoss, Weblogic, Oracle) Sumar al EJB Expert Group gente de JDO. de Tales from TheServerSide.com • El objetivo: "evolucionar rápidamente para soportar un gran rango de desarrolladores, incluyendo aquellos menos sofisticados” EJB 3.0 /** /** * @hibernate.class table="CATS" * @hibernate.property column="BIRTH_DATE" */ */ public class Cat { public Date getBirthdate() { JSR-175 @Session public class IdGeneratorImpl implements IdGenerator @TransactionAttribute(REQUIRES_NEW) public int nextId() @Table(name=“ITEMS”) public class Item { • Se definen en .java (sintaxis similar a una interfaz). • Se acceden por introspección o procesador de anotaciones (apt). • Hay que importarlos para utilizarlos: import javax.persistence.Session; EJB 3.0 Session Beans • POJO • Sin interfaz Home, otras interfaces POJI. • Métodos Callbacks opcionales (@PostConstruct, @PreDestroy, @PostActivate, @PrePassivate) • Interceptors (@Interceptor, @AroundInvoke) • Metadata como anotaciones Bean type, @Session, @Stateful, @MessageDriven Transaction attributes, @Transaction Dependency injection @EJB, @Resource, @PersistenceContext, Remoteness @Remote, @Local, @WebService (JSR-181) Remove method para stateful beans @Remove Rollback @ApplicationException(rollback=true) • Inyección de dependencias EJB 3.0 Inyección de dependencias • IoC Framework Inversión del control Principio de Hollywood – "Don't call me I will call you" Dependency Injection • Los componentes no poseen más el conocimiento de las dependencias, sino que éstas son ‘inyectadas’. • Tipos de ‘injection’ : Anotación de variable pública de instancia Setter Injection EJB 3.0 Ejemplo de EJB Session + Injection @Remote interface IdGenerator { int nextId(); } @Session public class IdGeneratorImpl implements IdGenerator { @Resource(name=“jdbc/PROD_OLTP”) public Datasource idDatasource; @TransactionAttribute(REQUIRES_NEW) public int nextId() { Connection c = idDatasource.getConnection(); try { Statement s = c.createStatement(“select sequence.nextval from dual”); ResultSet rs = s.executeQuery(); rs.next(); return rs.getInt(1); } catch (SQLException sqle) { throw new RuntimeException(sqle); } finally { c.close(); } } } EJB 3.0 Ejemplo de EJB Session + Injection @Session @Remote(IdClient.class) public class IdClientImpl implements IdClient { @EJB public IdGenerator idGeneratorBean; private SessionContext ctx; @Resource public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void useId() { int id = idGeneratorBean.nextId(); ... } } EJB 3.0 Entity Beans • POJO No requieren interfaces / herencias especiales Se pueden serializar, pueden ser devueltos al cliente • No requieren interface Home • Propiedades Id / Version • Soportan herencia y polimorfismo !!! • O/R Mapping Metadata como anotaciones Table mappings, @Table, @SecondaryTable Column mappings, @Column, @JoinColumn Associations, @ManyToOne, @OneToOne, @OneToMany, @ManyToMany Inheritance, @Inheritance, @DiscriminatorColumn Identifier + Version properties, @Id, @Version etc… EJB 3.0 Entity Beans • Métodos Callbacks opcionales. @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpdate, @PostLoad • EntityListener (@EntityListener) @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpdate, @PostLoad EJB 3.0 Ejemplo de Entity Bean @Entity @Table(name=“FACTURAS”) public class Factura { private Long id; private int version; private Date fecha; private Set<ItemFactura>items = new HashSet<ItemFactura>(); … @Column(name=“FECHA”, nullable=false) public Date getFecha() { return fecha; } public void setFecha(Date fecha) { this. fecha = fecha; } EJB 3.0 Ejemplo de Entity Bean ... @Id @Column(name=“ITEM_ID”) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Version public int getVersion() { return version; } protected void setVersion(int version) { this.version = version; } ... EJB 3.0 Ejemplo de Entity Bean @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name=“PRODUCTO_ID”, nullable=false, updatable=false) public Producto getProducto() { return producto; } protected void setProducto(Producto producto) { this.producto = producto; } ... EJB 3.0 Ejemplo de Entity Bean @OneToMany(cascade=CascadeType.ALL) @Column(name=“FACTURA_ID”, nullable=false, updatable=false) protected Set<ItemFactura> getItems() { return this.items; } protected void setItems(Set<ItemFactura> items) { this.items = items; } ... EJB 3.0 EntityManager API • Una interfaz “home” genérica (no tipificada) • Tiene asociado un contexto de persistencia • Es utilizado para crear, modificar y borrar entidades • Se pueden asociar entidades obtenidas en otros contextos a un contexto determinado EJB 3.0 EntityManager API new merge() merge() SQL INSERT SQL UPDATE New Managed persist() remove() SQL INSERT SQL DELETE Detached Contexto Finalizado EJB 3.0 Ejemplo de utilización de EntityManager @Session public class FacturasImpl implements Facturas { @PersistenceContext(unitName=“myUnit”) private EntityManager em; public Factura findById(Long id) { return em.find(Factura.class, id); } public Long create(Factura factura) { em.persist(factura); // factura es ahora ‘managed’ return factura.getId(); } } EJB 3.0 EntityManagerFactory • Interfaz utilizada para obtener EntityManager’s • Se puede obtener mediante: JNDI lookup IoC (@PersistenceUnit) Con la clase javax.persistence.Persistence EntityManagerFactory emf; EntityManager em; emf = Persistence.createEntityManagerFactory(“myUnit”); em = emf. createEntityManager(); EJB 3.0 Persistencia ‘plugueable’ • Se separó el API de persistencia (javax.persistence) • Se indica la implementación en el persistence.xml • Se podrá utilizar cualquier AS con cualquier implementación de persistencia. <?xml version="1.0" encoding="UTF-8"?> <persistence> <persistence-unit name=“myUnit” transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/MyDB</jta-data-source> <class>com.acme.MyClass</class> <properties> <property name="hibernate.max_fetch_depth" value="4"/> </properties> </persistence-unit> </persistence> EJB 3.0 Deployment Descriptor • Siguen existiendo. • Se pueden reemplazar o combinar con las anotaciones. • Sobreescriben lo indicado en las anotaciones miAplicacion.ear miAplicacion.war application.xml web.xml miModuloEJB.jar miModulo.jar ejb-jar.xml persistence.xml persistence.xml EJB 3.0 Query API • Son expresadas en EJBQL Embebidos en el código Definidos por anotaciones • Provee Agregación • Query interface Binding de parámetros Control de paginación SELECT c.status, avg(c.filledOrderCount), count(c)FROM Customer c GROUP BY c.status HAVING s.status IN (1, 2) Proyecciones SELECT new CustomerDetails(c.id, c.status, o.count) FROM Customer SubSelects SELECT goodCustomer FROM Customer goodCustomer WHERE goodCustomer.balance < (SELECT avg(c.balance) FROM Customer c) Querys Polimórficas !!! Native Queries EJB 3.0 Ejemplo de utilización de Query @Session public class ItemManagerImpl implements ItemManager { … public List findByDescription(String description, int page) { return em.createQuery( “select i from Item i where i.description like :d”) .setParameter(“d”, description) .setMaxResults(50) .setFirstResult(page*50) .listResults(); } EJB 3.0 En resumen • Una simplificación en comparación con EJB 2.x El mapeo relacional pasa a ser parte de la especificación • Realmente orientado a objetos • Inserción de las "Best Practices" existentes • Utilización intensiva de anotaciones (JSR175 / JDK5) • Su especificación ya es ‘Final Release’ Aprobado el 11 de Mayo de 2006. Ya hay implementaciones productivas. • Separación de la persistencia (JPA) EJB 3.0 En resumen EJB EJB EJBLocalObject public class CustomerBean extends EntityBean public interface Customer implements EJBLocalObject { EJBObject … @Entity … … @Table (name=“CUSTOMER”) } { … public interface CustomerRemote implements EJBObject } { EJBHome public class CustomerBean { Desing Patterns @Id @Column(name=“CUSTOMER_ID”) ServiceLocator public long getId() { return id; } DTO public setId(long i) {Bussines id = i; } Delegate … … Mantenimiento longpublic getId(); interface CustomerHome implements setId(long id(;EJBLocalHome public abstrac setId(… } EJBLocalHome { public abstract long getId(); Sincronización etc … } public interface long CustomerRemoteHome getId(); implements ejb-jar.xml EJBHome setId(long id(; <ejb-jar> { … weblogic-rdbms-ejb-jar.xml <enterprise-beans> … <weblogic-rdbms-jar> <entity> } <weblogic-rdbms-bean> <ejb-name>Customer</ejb-name> <ejb-name>Customer</ejb-name> <local-home>CustomerHome</localweblogic-ejb-jar.xml home> <data-sourcename>java:/dataSource</data<weblogic-enterprise-bean> <local>Customer</local> source-name> <ejb-name>Customer</ejb-name> <ejb-class>CustomerBean</ejb<table-name>CUSTOMER</table-name> class> <jndi-name>Customer</jndi<field-map> name> …. <cmp-field>id</cmp-field> </weblogic-enterprise-bean> <dbms-column>ID</dbms-column>…. } / Generadores custom Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs Historia y evolución Problemática La elección pragmática • EJB 3.0 Evolución de los EJBs Tour por EJB 3.0 Ejemplos •¿Qué dirección tomar? • Conclusiones ¿Qué dirección tomar? Opciones • Utilizar un contenedor EJB 3.0 / J2EE 5 • Utilizar un contenedor EJB 2.0 + JPA • No utilizar un contenedor EJB (Servicios + JPA) ¿Qué dirección tomar? EJB 3.0 / J2EE 5 Web Services Technologies • • • • • • • Implementing Enterprise Web Services (JSR 109) Java API for XML-Based Web Services (JAX-WS) 2.0 (JSR 224) Java API for XML-Based RPC (JAX-RPC) 1.1 (JSR 101) Java Architecture for XML Binding (JAXB) 2.0 (JSR 222) SOAP with Attachments API for Java (SAAJ) (JSR 67) Streaming API for XML (JSR 173) Web Service Metadata for the Java Platform (JSR 181) Web Application Technologies • • • • JavaServer Faces 1.2 (JSR 252) JavaServer Pages 2.1 (JSR 245) JavaServer Pages Standard Tag Library (JSR 52) Java Servlet 2.5 (JSR 154) Enterprise Application Technologies • • • • • • • • • Common Annotations for the Java Platform (JSR 250) Enterprise JavaBeans 3.0 (JSR 220) J2EE Connector Architecture 1.5 (JSR 112) JavaBeans Activation Framework (JAF) 1.1 (JSR 925) JavaMail (JSR 919) Java Data Objects (JDO) (JSR 243) Java Message Service API (JMS) (JSR 914) Java Persistence API (JPA) (JSR 220) Java Transaction API (JTA) (JSR 907) Management and Security Technologies • J2EE Application Deployment (JSR 88) • J2EE Management (JSR 77) • Java Authorization Contract for Containers (JSR 115) ¿Qué dirección tomar? Implementaciones EJB 3.0 / J2EE 5 WebLogic Server v10.0 Oracle Application Server 11 Productivo – (J2EE 5) Productivo – (J2EE 5) SAP NetWeaver 7.1 Trial Version - (J2EE 5) GlassFish Application Server Reference Implementation - (J2EE 5) Sun Java System Application Server Platform Edition 9 Productivo – (J2EE 5) Apache Geronimo-2.0-M6-rc1 TmaxSoft JEUS 6 Productivo – (J2EE 5) Productivo – (J2EE 5) Apusic Application Server (v5.0) (J2EE 5) Application Server 4.2.0 GA Productivo - (EJB 3.0) ¿Qué dirección tomar? EJB 2.0 + JPA • Simplifico la persistencia • Los patterns VO, DTO dejan de ser obligatorios • Modelo de dominio 100% orientado a objetos • Simplificamos el testeo de los objetos de dominio • Sigo utilizando servicios del contenedor (Pooling, JMS, CMT, JTA, Seguridad, Clustering, Availability, Load Balance) • Migración ordenada a EJB 3.0 ¿Qué dirección tomar? EJB 2.0 + JPA EJB 3.0 Client Client POJO POJO Bussines Delegate Bussines Delegate POJO EJB 3.0 annotations Session Bean EJB 2.0 POJO EJB 3.0 annotations javax.persistence.Query javax.persistence.EntityManager POJO EJB 3.0 annotations javax.persistence.Query javax.persistence.EntityManager ¿Qué dirección tomar? EJB 2.0 + JPA Session Bean EJB 2.0 EJB 3.0 POJO EJB 3.0 annotations • Cambiar implementación interfaz Session por anotación • Cambiar métodos callback por anotación • Revisar inyección de dependencias Utilizar algún pattern de tipo ServiceLocator Utilizar un método de libreria para obtener EntityManager ¿Qué dirección tomar? EJB 2.0 + JPA EJB 3.0 Session Bean EJB 2.0 POJO POJO EJB 3.0 annotations • El session solo es un ‘proxy’ de acceso al servicio • El session es el encargado de inyectar dependencias al POJO • Solo hay que agregar anotaciones al migrar • Puedo testear mi servicio fuera del contenedor ¿Qué dirección tomar? Implementaciones JPA Hibernate 3.2.2 GA Oracle TopLink 11g OpenJPA 0.9.7 Kodo™ Bea Kodo 4.1 ¿Qué dirección tomar? Servicios + JPA • Simplifico la persistencia • Los patterns VO, DTO dejan de ser obligatorios • Modelo de dominio 100% orientado a objetos • Simplificamos el testeo del servicio y los objetos de dominio • Puedo utilizar algun framework liviano de middleware (Spring, HiveMind, Pico Container, etc) • Migración ordenada a EJB 3.0 cuando fuera necesario ¿Qué dirección tomar? Servicios + JPA EJB 3.0 Client Client POJO POJO Bussines Delegate Bussines Delegate Inyección del Servicio XML POJO EJB 3.0 annotations POJO POJO Inyección del Servicio EJB 3.0 annotations javax.persistence.Query javax.persistence.EntityManager POJO EJB 3.0 annotations javax.persistence.Query javax.persistence.EntityManager ¿Qué dirección tomar? Servicios + JPA EJB 3.0 POJO POJO EJB 3.0 annotations • Agregar anotaciones de Session • Revisar manejo transaccional Utilizar algun manejo declarativo en el contenedor liviano • Revisar inyección de dependencias Agregar anotaciones de injection del contenedor EJB 3 ¿Qué dirección tomar? Containers livianos PicoContainer / NanoContainer ¿Qué dirección tomar? • Framework open source de ORM con servicio de soporte • Se puede configurar con xml /xDoclets/anotaciones • Soporta JTA, JNDI, JPA (con Java 1.5) • Puede correr en un contenedor EJB 2.x • Motor de persistencia de JBoss • Puede ser utilizado como motor de cualquier container EJB 3.0 Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs Historia y evolución Problemática La elección pragmática • EJB 3.0 Evolución de los EJBs Tour por EJB 3.0 Ejemplos •¿Qué dirección tomar? • Conclusiones Conclusiones Session Beans / MDB, ¿pare de sufrir? Intrusivo Complejidad EJB 2.x EJB 3.0 @MessageDriven @Stateless(name="ReviewService") @Stateless (mappedName = "weblogic.examples.ejb30.ExampleQueue", @Remote(ReviewService.class) Interfaces @anotaciones y/o @Remote(ReviewListener.class) name =ReviewManagerBean "WatchProcessMDB", callBacks <descriptores.xml> public class implements ReviewService { public class ReviewListenerBean implements ReviewListener{ activationConfig = { @PersistenceContext(unitName = "reviewSession") @Resource(name = "jms/mdbQCF", mappedName = @ActivationConfigProperty( @anotaciones y/o private EntityManager em; "weblogic.examples.ejb30.QueueConnectionFactory") ejb-jar.xml <descriptores.xml> propertyName = "destinationType", @EJB private QueueConnectionFactory mdbQCF; xxx-ejb-jar.xml Interfaz de servicio Remote, Local, Home propertyValue =mappedName "javax.jms.Queue") ReviewListener @Resource(name =listener; "jms/mdbQueue", = "weblogic.examples.ejb30.ExampleQueue") } @PostConstruct Dependencias Testing private Queueinit() mdbQueue; ) void public { @anotaciones y/o JNDI lookups ... public class WatchProcessMDB implements MessageListener { ... <descriptores.xml> ... } @PersistenceContext(unitName = "reviewSession") ComplejoEntityManager Necesita un container para em; } ... private inyeccion de dependencias. ... ... ... Conclusiones Entity Beans, ¿pare de sufrir? @Entity EJB 2.x @Table(name = "PERSON") Serializables EJB 3.0 @Inheritance(strategy =SiInheritanceType.TABLE_PER_CLASS) No public class Person implements Serializable { Herencia Polimorfismo @Id No Si @Column(name = "NAME") private String name; EJB-QL Limitante ... Mas poderoso @ManyToOne(cascade = CascadeType.MERGE) Complejidad @anotaciones @JoinColumn(name = "REVIEWED") ejb-jar.xml persistence.xml xxx-ejb-jar.xml private Item reviewed; db-xxx-ejb.jar.xml ... Local, Home ... Testing ... Complejo ... Simple Conclusiones EJB 3.0 • Un paso adelante hacia la simplicidad en J2EE • Permitirá un diseño realmente orientado a objetos • La especificación ya es un Final Release • Ya existen implementaciones productivas (muchas basadas en productos con larga historia en el mercado) • Los ORM y middleware livianos proveen herramientas para trabajar de una manera simple y posibilitar una migración ordenada en caso de necesidad. Conclusiones EJB 3.0 Expert Group ? Gracias por su atención