Enterprise JavaBeans: Historia y Evolución de los Componentes Empresariales en Java

📅 Actualizado en febrero 2026 ✍️ Ángel López ⏱️ 18 min de lectura ✓ Nivel intermedio ★ ★ ★ ★ ★ (5/5)
⚠️ Nota importante: Este artículo tiene un enfoque histórico-evolutivo. Enterprise JavaBeans (EJB) en su forma clásica es una tecnología obsoleta que ya no se utiliza en proyectos nuevos. Sin embargo, comprender su historia es fundamental para entender cómo llegamos a las herramientas modernas como Spring Boot y Jakarta EE. Estudiar los errores del pasado nos convierte en mejores ingenieros.

📜 Contexto histórico: Java en los años 90

Para entender Enterprise JavaBeans debemos transportarnos a finales de los años 90. Java acababa de irrumpir en el mundo de la programación con una promesa revolucionaria: "Write Once, Run Anywhere". James Gosling y su equipo en Sun Microsystems habían creado un lenguaje que por primera vez hacía realista la idea de escribir código portable entre plataformas.

James Gosling, creador del lenguaje de programación Java, en 2008
James Gosling, creador de Java, fotografiado en 2008.
Foto: Peter Campbell · CC BY-SA 4.0 · Wikimedia Commons

En aquel momento, el mundo empresarial vivía una transformación: las grandes corporaciones querían migrar sus sistemas de mainframes y cliente-servidor hacia aplicaciones distribuidas basadas en Internet. Los bancos, las aseguradoras y las grandes compañías necesitaban un estándar que les permitiera construir aplicaciones con transacciones distribuidas, seguridad, persistencia y comunicación remota entre componentes.

La respuesta de Sun Microsystems fue ambiciosa: la plataforma J2EE (Java 2 Platform, Enterprise Edition), presentada en 1999. Y el corazón de J2EE era una especificación llamada Enterprise JavaBeans (EJB). La idea era brillante sobre el papel: definir un modelo estándar de componentes del lado del servidor que cualquier fabricante pudiera implementar.

📌 Dato histórico: La primera especificación EJB (1.0) fue publicada en marzo de 1998. La versión más influyente fue EJB 2.0 (agosto de 2001), que se convirtió en el estándar corporativo dominante durante casi una década, a pesar de su enorme complejidad.

El contexto es importante porque en los años 90 no existían las alternativas que tenemos hoy. No había Spring, no había Hibernate, no había contenedores ligeros. Las opciones eran CORBA (aún más complejo que EJB), código propietario de cada fabricante, o EJB. Para muchas empresas, EJB parecía la opción más razonable.

🏗️ ¿Qué eran los Enterprise JavaBeans?

La especificación Enterprise JavaBeans definía una arquitectura para un sistema de objetos transaccionales distribuidos basado en componentes. En términos más sencillos: EJB era un conjunto de reglas que permitían crear piezas de software (llamadas beans) que vivían dentro de un servidor de aplicaciones y que el servidor gestionaba automáticamente.

La promesa central de EJB era que el desarrollador solo tenía que escribir la lógica de negocio, y el servidor de aplicaciones — a través de su contenedor EJB — se encargaría de todo lo demás: transacciones, seguridad, persistencia, comunicación remota, gestión de memoria y concurrencia.

El modelo de programación EJB

ElementoFunciónDescripción
Interface RemoteMétodos de negocioDeclaraba los métodos que el cliente podía invocar. Extendía javax.ejb.EJBObject
Interface HomeCiclo de vidaPermitía crear, buscar y destruir beans. Extendía javax.ejb.EJBHome
Clase BeanImplementaciónContenía la lógica de negocio. Implementaba EntityBean o SessionBean
Descriptor XMLConfiguraciónArchivo ejb-jar.xml con transacciones, seguridad y relaciones

Es decir, para escribir un simple componente de negocio, había que crear al menos 3 archivos Java y 1 archivo XML. Esto contrastaba enormemente con lo que un desarrollador necesita hoy en Spring Boot: una sola clase anotada.

⚙️ Arquitectura EJB: contenedores, beans y contratos

Los Enterprise JavaBeans eran componentes que se ejecutaban en un entorno especial llamado contenedor EJB. El contenedor hospedaba y gestionaba los beans de manera similar a como un servidor web hospeda servlets. Un bean enterprise no podía funcionar fuera de su contenedor.

Servicios del contenedor EJB

ServicioDescripción
Acceso remotoClientes en otras máquinas podían invocar métodos del bean a través de la red
TransaccionesGestión automática de transacciones (commit/rollback) sin código explícito
SeguridadControl de quién podía acceder a qué métodos del bean
PersistenciaAlmacenamiento y recuperación automática de datos (en Entity Beans)
ConcurrenciaGestión del acceso simultáneo de múltiples clientes
Ciclo de vidaCreación, destrucción y reutilización de beans según la demanda

El contenedor aislaba al bean del acceso directo de las aplicaciones cliente. Cuando un cliente llamaba a un método del bean, el contenedor interceptaba la llamada para aplicar seguridad, transacciones y persistencia de forma transparente.

El mecanismo de stubs y skeletons

Para la comunicación entre máquinas, EJB utilizaba un mecanismo heredado de Java RMI basado en stubs (representantes locales) y skeletons (receptores remotos):

Flujo de comunicación remota en EJB clásico
  CLIENTE (Máquina A)              RED               SERVIDOR (Máquina B)
  ┌──────────────┐                                    ┌──────────────┐
  │  Aplicación  │                                    │  Contenedor  │
  │  cliente     │                                    │     EJB      │
  │  ┌────────┐  │    Mensaje de red (JRMP/IIOP)     │  ┌────────┐  │
  │  │  STUB  │──┼──────────────────────────────────►│  │SKELETON│  │
  │  │(proxy) │◄─┼──────────────────────────────────◄│  │        │  │
  │  └────────┘  │    Resultado serializado           │  └───┬────┘  │
  │  Parece un   │                                    │      ▼       │
  │  objeto      │                                    │  ┌────────┐  │
  │  local       │                                    │  │  BEAN  │  │
  └──────────────┘                                    │  │ (real) │  │
                                                      └──────────────┘

El stub implementaba el interface remoto pero no contenía lógica de negocio: era un proxy de red. Cuando el cliente invocaba un método, el stub enviaba un mensaje al skeleton, que delegaba al bean real. Desde la perspectiva del cliente, parecía un objeto local.

📡 Protocolos de la época: EJB soportaba JRMP (Java Remote Method Protocol) e IIOP (Internet Inter-ORB Protocol, de CORBA). Una versión especializada llamada Java RMI-IIOP combinaba ambos. Hoy, ambos protocolos están en desuso, reemplazados por REST y gRPC.

🧩 Tipos de beans: entidad, sesión y mensaje

Bean de Entidad (Entity Bean)

Representaban datos persistentes en una base de datos. Cada instancia correspondía a un registro. Por ejemplo, un ClienteBean representaba un cliente almacenado en la tabla de clientes.

Entity Bean — EJB 2.x (código histórico)
// Interface Remote — métodos de negocio
public interface Cliente extends javax.ejb.EJBObject {
    String getNombre() throws RemoteException;
    void setNombre(String nombre) throws RemoteException;
    String getDireccion() throws RemoteException;
}

// Interface Home — ciclo de vida
public interface ClienteHome extends javax.ejb.EJBHome {
    Cliente create(String nombre) throws CreateException, RemoteException;
    Cliente findByPrimaryKey(Integer id) throws FinderException, RemoteException;
}

// Clase Bean — implementación real
public class ClienteBean implements javax.ejb.EntityBean {
    private EntityContext ctx;
    public String nombre;
    public String direccion;

    public String getNombre() { return nombre; }
    public void setNombre(String n) { this.nombre = n; }

    // 7 métodos de ciclo de vida OBLIGATORIOS (la mayoría vacíos)
    public void setEntityContext(EntityContext ctx) { this.ctx = ctx; }
    public void unsetEntityContext() { ctx = null; }
    public void ejbActivate() { }
    public void ejbPassivate() { }
    public void ejbLoad() { }
    public void ejbStore() { }
    public void ejbRemove() { }
}
⚠️ Obsoleto: Los Entity Beans fueron eliminados de la especificación en EJB 3.2 (2013). Fueron reemplazados por JPA (Java Persistence API). Nunca deben usarse en proyectos nuevos.

Bean de Sesión (Session Bean)

Representaban procesos o tareas de negocio: procesar un pedido, calcular impuestos, reservar una habitación. Existían dos subtipos:

SubtipoEstadoEjemplo
StatefulMantiene estado entre llamadas del mismo clienteCarrito de compras
StatelessSin estado entre llamadasCalculadora de impuestos

Bean de Mensaje (Message-Driven Bean)

Introducidos en EJB 2.0, los Message-Driven Beans (MDB) procesaban mensajes asíncronos desde colas JMS. No tenían interfaces Remote ni Home. Este fue el tipo de bean mejor diseñado y su concepto sigue vigente hoy en Apache Kafka y RabbitMQ.

🔌 Los interfaces Home y Remote

Cada bean necesitaba dos interfaces obligatorios: el Home (extendiendo javax.ejb.EJBHome) para el ciclo de vida (crear, buscar, destruir) y el Remote (extendiendo javax.ejb.EJBObject) para los métodos de negocio.

Uso típico de un bean EJB desde una aplicación cliente
// 1. Obtener el contexto JNDI
Context ctx = new InitialContext(propiedades);

// 2. Buscar el interface Home en JNDI
Object ref = ctx.lookup("java:comp/env/ejb/ClienteHome");
ClienteHome home = (ClienteHome) PortableRemoteObject.narrow(
    ref, ClienteHome.class);

// 3. Crear un bean a través del Home
Cliente cliente = home.create("María García");

// 4. Usar los métodos de negocio
cliente.setDireccion("Calle Mayor 15, Madrid");

// 5. Buscar un bean existente
Cliente otro = home.findByPrimaryKey(new Integer(42));

Observa la cantidad de pasos ceremoniales solo para obtener una referencia a un simple objeto de negocio. El lookup JNDI, el narrow(), el Home como intermediario... Este código repetitivo fue una de las razones principales del descontento de la comunidad.

💥 Los problemas de EJB: por qué la comunidad se rebeló

A principios de los años 2000, la frustración con EJB alcanzó niveles críticos. Los problemas eran múltiples y profundos:

1. Complejidad desproporcionada

Un simple bean requería 3 archivos Java + XML. Para una aplicación con 50 conceptos de negocio: 150+ archivos Java y miles de líneas de XML. La mayor parte era puro boilerplate sin valor de negocio.

2. Entity Beans: un desastre de rendimiento

Los Entity Beans con Container-Managed Persistence (CMP) generaban consultas SQL extremadamente ineficientes. El resultado era aplicaciones lentas que no escalaban.

3. Testeo imposible

Como los beans dependían completamente del contenedor, era prácticamente imposible ejecutar tests unitarios. Para probar un método, había que desplegar en un servidor de aplicaciones completo.

4. Vendor lock-in

Aunque EJB prometía portabilidad, cada servidor (WebLogic, WebSphere, JBoss) tenía descriptores de despliegue adicionales y comportamientos específicos. La portabilidad era más ideal que realidad.

5. Servidores pesados y caros

Ejecutar EJB requería servidores como IBM WebSphere (licencias de decenas de miles de euros) que consumían enormes cantidades de memoria y tardaban minutos en arrancar.

🎯 Perspectiva moderna: Una aplicación Spring Boot actual arranca en 2-3 segundos, permite ejecutar miles de tests sin servidor, y se despliega en un JAR ejecutable de 20 MB. La diferencia con la experiencia de desarrollo EJB es abismal.

🌱 La revolución Spring: Rod Johnson y el libro que cambió Java

La historia de la caída de EJB y el ascenso de Spring es una de las más fascinantes de la ingeniería de software. Todo comenzó con un libro.

En octubre de 2002, un consultor australiano llamado Rod Johnson publicó "Expert One-on-One J2EE Design and Development" (Wrox Press). Johnson tenía un perfil inusual: doctor en Musicología por la Universidad de Sídney, reconvertido en arquitecto de software empresarial con años de experiencia en la banca de Londres. Su libro contenía una crítica demoledora de EJB, pero no se limitaba a señalar problemas: incluía más de 30.000 líneas de código que demostraban una alternativa funcional.

Logo del Spring Framework, creado por Rod Johnson en 2003
Logo de Spring Framework · Apache License · Wikimedia Commons

La tesis central de Johnson era revolucionaria: la mayor parte de la complejidad de EJB era innecesaria. Se podían construir aplicaciones empresariales robustas usando POJOs simples con un contenedor ligero que proporcionara Inyección de Dependencias y Programación Orientada a Aspectos (AOP).

El código de ejemplo de ese libro fue liberado como software libre y, en febrero de 2003, un pequeño equipo creó un proyecto en SourceForge. Lo llamaron Spring Framework, y su versión 1.0 se publicó en marzo de 2004.

Los principios de Spring que derrotaron a EJB

Principio SpringProblema EJB que resolvía
POJOs simplesEliminaba las interfaces obligatorias (Home, Remote, EntityBean)
Inyección de DependenciasSustituía los lookups JNDI manuales por configuración declarativa
No requiere app serverFuncionaba con un simple Tomcat (gratuito) en lugar de WebSphere
TesteablePOJOs testeables unitariamente sin contenedor
AOPTransacciones y seguridad sin acoplar al código de negocio
Integración HibernateReemplazaba Entity Beans con un ORM ligero y eficiente

En 2004, Johnson publicó un segundo libro aún más contundente: "J2EE without EJB" (junto a Jürgen Hoeller). El título lo decía todo. La comunidad Java votó masivamente con los pies: los nuevos proyectos adoptaron Spring.

El mismo bean Cliente en Spring (comparar con el código EJB anterior)
// ¡Una sola clase! Sin interfaces obligatorios, sin XML de despliegue
@Service
public class ClienteService {

    @Autowired
    private ClienteRepository repository;

    public Cliente crear(String nombre) {
        return repository.save(new Cliente(nombre));
    }

    public Cliente buscarPorId(Long id) {
        return repository.findById(id)
            .orElseThrow(() -> new ClienteNotFoundException(id));
    }

    @Transactional
    public void actualizarDireccion(Long id, String direccion) {
        Cliente c = buscarPorId(id);
        c.setDireccion(direccion);
    }
}

La diferencia es brutal: de 3 archivos Java + XML con decenas de líneas de ceremonia, a una sola clase limpia y testeable.

🔄 EJB 3.0: la simplificación tardía

En 2006 se publicó EJB 3.0, que representó un cambio radical en la filosofía:

AspectoEJB 2.x (clásico)EJB 3.0 (simplificado)
InterfacesObligatorios: Home + RemoteOpcionales. Basta con anotaciones
ConfiguraciónDescriptores XML extensosAnotaciones Java (@Stateless, @Entity)
PersistenciaEntity Beans (CMP/BMP)JPA con @Entity y EntityManager
Clase beanImplementa interfaces EJBPOJO con anotaciones
LookupJNDI manualInyección con @EJB o @Inject
Session Bean en EJB 3.0 — Mucho más simple que EJB 2.x
@Stateless
public class CajeroDeHotelBean {

    @PersistenceContext
    private EntityManager em;

    public void reservarHabitacion(Long clienteId, Long habitacionId) {
        Habitacion hab = em.find(Habitacion.class, habitacionId);
        Cliente cli = em.find(Cliente.class, clienteId);
        hab.setOcupada(true);
        hab.setCliente(cli);
    }
}

EJB 3.0 fue una mejora enorme, pero llegó demasiado tarde. Para 2006, Spring ya tenía millones de usuarios y un ecosistema maduro. Además, EJB 3.0 seguía requiriendo un servidor de aplicaciones completo. La batalla ya estaba perdida.

🚀 Spring Boot: el estándar de facto moderno

Si Spring Framework ganó la batalla contra EJB, Spring Boot (lanzado en abril de 2014) ganó la guerra definitiva. Spring Boot eliminó la última barrera: la configuración.

Logo de Spring Boot
Logo de Spring Boot · CC BY-SA 2.0 · Wikimedia Commons

Spring Boot introdujo auto-configuración: el framework detecta las bibliotecas del classpath y se configura automáticamente. Un desarrollador puede crear una aplicación web empresarial funcional en minutos.

Aplicación empresarial completa con Spring Boot
// 1. Entidad JPA (reemplaza los Entity Beans)
@Entity
public class Cliente {
    @Id @GeneratedValue
    private Long id;
    private String nombre;
    private String direccion;
}

// 2. Repositorio (acceso a datos automático)
public interface ClienteRepository
        extends JpaRepository<Cliente, Long> {
    List<Cliente> findByCodigoPostal(String cp);
}

// 3. Servicio (reemplaza los Session Beans)
@Service
public class ClienteService {
    private final ClienteRepository repo;

    public ClienteService(ClienteRepository repo) {
        this.repo = repo;
    }

    @Transactional
    public Cliente crear(String nombre) {
        return repo.save(new Cliente(nombre));
    }
}

// 4. API REST (exposición de servicios)
@RestController
@RequestMapping("/api/clientes")
public class ClienteController {
    private final ClienteService service;

    @PostMapping
    public Cliente crear(@RequestBody String nombre) {
        return service.crear(nombre);
    }

    @GetMapping("/{id}")
    public Cliente obtener(@PathVariable Long id) {
        return service.buscarPorId(id);
    }
}

Estas pocas decenas de líneas limpias hacen todo lo que un sistema EJB 2.x necesitaba cientos de líneas, múltiples interfaces y archivos XML para lograr. Se puede testear, arranca en segundos y se despliega como un simple JAR ejecutable.

🌐 Jakarta EE: el legado renombrado

Logo de Jakarta EE, sucesor de Java EE
Logo de Jakarta EE · Eclipse Public License · Wikimedia Commons

En septiembre de 2017, Oracle transfirió Java EE a la Eclipse Foundation. Como no pudo transferir la marca "Java", la plataforma se renombró a Jakarta EE. El cambio más visible: todos los paquetes javax.* pasaron a jakarta.*.

AspectoJava EE (Oracle)Jakarta EE (Eclipse)
GobernanzaOracle + JCP (proceso cerrado)Eclipse Foundation (abierta)
Namespacejavax.*jakarta.*
Última versiónJava EE 8 (2017)Jakarta EE 11 (2024)
ServidoresWildFly, GlassFish, WebSphereWildFly, GlassFish, Open Liberty

Jakarta EE sigue incluyendo EJB (como jakarta.ejb), pero su relevancia ha disminuido significativamente. Las tecnologías más activas son JPA, JAX-RS, CDI y JSON-B/JSON-P.

⚖️ Comparativa: EJB clásico vs Spring Boot moderno

CriterioEJB 2.x (2001)Spring Boot (2024+)
Archivos por bean3 Java + 1 XML mínimo1 clase Java anotada
Tiempo arranque1-5 minutos2-5 segundos
ServidorApp server completoTomcat embebido (incluido en JAR)
Coste licencia$10.000 - $100.000+/año$0 (código abierto)
Tests unitariosPrácticamente imposiblesNativos con JUnit y Mockito
DespliegueEAR/WAR en app serverjava -jar app.jar
ComunicaciónRMI/IIOP con stubsREST sobre HTTP (JSON)
PersistenciaEntity Beans (eliminados)Spring Data JPA + Hibernate
Cloud-nativeNo diseñado para la nubeDocker/Kubernetes nativo
MicroserviciosConcepto inexistenteSoporte nativo (Spring Cloud)

🏚️ ¿Qué queda hoy de EJB? Tecnología legacy

Aplicaciones legacy en mantenimiento: Miles de aplicaciones bancarias y gubernamentales escritas entre 2000 y 2010 todavía funcionan con EJB sobre WebSphere o WebLogic. Se mantienen porque reescribirlas es costoso, no porque EJB sea la mejor opción.

Tecnologías eliminadas o muertas:

TecnologíaEstadoReemplazo
Entity Beans❌ Eliminados en EJB 3.2JPA
Interfaces Home/Remote❌ Innecesarios desde EJB 3.0Anotaciones + CDI
CORBA / IIOP❌ Eliminado de Java SE 11REST / gRPC
Stubs y Skeletons❌ Obsoletos desde Java 5Proxies dinámicos
Namespace javax.ejb⚠️ En desusojakarta.ejb

📚 Lecciones aprendidas para el desarrollador actual

🎯 La simplicidad gana. Spring derrotó a EJB no por tener más funcionalidades, sino por ser más simple. El código más fácil de escribir, leer y testear siempre se impone a largo plazo.

🎯 Las especificaciones por comité pueden fracasar. EJB fue diseñado por comités de grandes empresas pensando en los escenarios más complejos. El resultado fue una especificación sobreingenieriada.

🎯 La testeabilidad no es opcional. La imposibilidad de hacer tests unitarios con EJB fue una de sus mayores debilidades. Hoy sabemos que el código que no se puede testear no se puede mantener.

🎯 La comunidad manda. No importa cuántas empresas respalden un estándar: si los desarrolladores encuentran algo mejor, migrarán. EJB tenía el respaldo de Sun, IBM y Oracle. Spring era un proyecto open-source pequeño. Spring ganó porque resolvía problemas reales.

🎯 Ninguna tecnología es para siempre. EJB dominó durante una década. Hoy es legacy. Spring Boot domina ahora, pero algún día también será reemplazado. La capacidad de adaptarse es la habilidad más valiosa de un ingeniero de software.

✏️ Ejercicios prácticos

Ejercicio 1: Identificar la época del código

Observa el siguiente fragmento y responde: ¿a qué época/tecnología pertenece? ¿Cuál sería su equivalente moderno?

Código del ejercicio
Context ctx = new InitialContext();
Object ref = ctx.lookup("java:comp/env/ejb/PedidoHome");
PedidoHome home = (PedidoHome) PortableRemoteObject.narrow(ref, PedidoHome.class);
Pedido pedido = home.create("PED-001", clienteId);
pedido.addLinea(productoId, cantidad);
double total = pedido.calcularTotal();
Ver solución

Código EJB 2.x (2001-2006). Pistas: lookup JNDI, PortableRemoteObject.narrow() (CORBA), interface Home para crear instancias. Equivalente moderno:

Spring Boot
@Autowired private PedidoService pedidoService;
Pedido pedido = pedidoService.crear("PED-001", clienteId);
pedidoService.addLinea(pedido.getId(), productoId, cantidad);
double total = pedidoService.calcularTotal(pedido.getId());

Ejercicio 2: Refactorizar de EJB a Spring

Reescribe este Entity Bean EJB 2.x usando JPA + Spring Data:

Entity Bean EJB 2.x
public interface Producto extends javax.ejb.EJBObject {
    String getNombre() throws RemoteException;
    double getPrecio() throws RemoteException;
    int getStock() throws RemoteException;
    void reducirStock(int cantidad) throws RemoteException;
}
public interface ProductoHome extends javax.ejb.EJBHome {
    Producto create(String nombre, double precio) throws CreateException, RemoteException;
    Producto findByPrimaryKey(Integer id) throws FinderException, RemoteException;
    Collection findByPrecioMenorQue(double max) throws FinderException, RemoteException;
}
public class ProductoBean implements javax.ejb.EntityBean {
    public String nombre; public double precio; public int stock;
    // + 7 métodos de ciclo de vida obligatorios vacíos...
}
Ver solución
JPA + Spring Data
@Entity
public class Producto {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String nombre;
    private double precio;
    private int stock;

    protected Producto() { }
    public Producto(String nombre, double precio) {
        this.nombre = nombre;
        this.precio = precio;
    }

    public void reducirStock(int cantidad) {
        if (cantidad > stock) throw new IllegalArgumentException("Stock insuficiente");
        this.stock -= cantidad;
    }
    // Getters y setters
}

public interface ProductoRepository extends JpaRepository<Producto, Integer> {
    List<Producto> findByPrecioLessThan(double max);
}

De 3 archivos con ~40 líneas de boilerplate a 2 archivos donde cada línea tiene propósito real. Los métodos de búsqueda se generan automáticamente por Spring Data.

Ejercicio 3: Línea temporal de la evolución

Ordena cronológicamente: a) Spring Boot b) EJB 1.0 c) Rod Johnson publica su libro d) Oracle transfiere Java EE e) EJB 3.0 f) Eliminación de CORBA de Java SE 11

Ver solución

b) 1998 — EJB 1.0: Nace la especificación que prometía simplificar el desarrollo empresarial.

c) 2002 — Rod Johnson publica su libro: Demuestra que EJB es innecesariamente complejo. Da origen a Spring (2003).

e) 2006 — EJB 3.0: Simplificación radical, pero llega demasiado tarde.

a) 2014 — Spring Boot: Auto-configuración, servidor embebido, arranque en segundos. Dominio total de Spring.

d) 2017 — Oracle transfiere Java EE: Nace Jakarta EE bajo Eclipse Foundation.

f) 2018 — CORBA eliminado de Java SE 11: Limpieza definitiva de la tecnología fundacional de EJB.

❓ Preguntas frecuentes sobre Enterprise JavaBeans: Historia y Evolución de los Componentes Empresariales en Java

Las dudas más comunes respondidas de forma clara y directa.

EJB existe todavía dentro de Jakarta EE (como jakarta.ejb), pero su uso en proyectos nuevos es extremadamente raro. La inmensa mayoría de la industria utiliza Spring Boot o frameworks similares. Los EJB solo se encuentran en aplicaciones legacy que se mantienen por razones de negocio, no por elección técnica.
EJB es una especificación de Java EE/Jakarta EE que requiere un servidor de aplicaciones completo (como WildFly o WebSphere). Spring es un framework independiente que funciona con un simple contenedor de servlets (como Tomcat) o incluso embebido. Spring promueve POJOs simples con inyección de dependencias, mientras que EJB clásico obligaba a implementar interfaces pesadas y depender del contenedor para todo.
Los Entity Beans fracasaron por su enorme complejidad, bajo rendimiento y abstracción excesiva. Requerían múltiples interfaces, descriptores XML extensos y generaban consultas SQL ineficientes. Fueron oficialmente eliminados en EJB 3.2 y reemplazados por JPA (Java Persistence API), que ofrece un mapeo objeto-relacional mucho más sencillo y eficiente basado en anotaciones.
Jakarta EE es la continuación de Java EE bajo la Eclipse Foundation. Cuando Oracle transfirió Java EE en 2017, no pudo transferir la marca "Java", por lo que se renombró a Jakarta EE. Técnicamente es la misma plataforma, pero con el namespace cambiado de javax.* a jakarta.* y gobernanza comunitaria abierta.
Sin duda Spring Boot. Es el estándar de facto en la industria para desarrollo empresarial en Java, con un ecosistema enorme, documentación excelente y demanda laboral muy superior. Conocer la historia de EJB es útil culturalmente y para entender código legacy, pero invertir tiempo en aprender EJB clásico no tiene retorno profesional en proyectos nuevos.
CORBA (Common Object Request Broker Architecture) fue un estándar de los años 90 para comunicación entre objetos distribuidos en diferentes lenguajes. Era extremadamente complejo, con IDL propio y un protocolo llamado IIOP. Fue desplazado primero por SOAP, luego por REST, y eliminado de Java SE en Java 11 (2018). Hoy se considera completamente obsoleto.
El libro "Expert One-on-One J2EE Design and Development" de Rod Johnson, publicado en 2002 por Wrox Press. En él, Johnson demostró que la mayor parte de la complejidad de EJB era innecesaria y que se podían construir aplicaciones empresariales robustas con POJOs simples e inyección de dependencias. El código de ejemplo se convirtió en la base del Spring Framework.
Valora este artículo

💬 Foro de discusión

¿Tienes dudas sobre Enterprise JavaBeans: Historia y Evolución de los Componentes Empresariales en Java? Comparte tu pregunta con la comunidad.

¿Tienes cuenta? o comenta como invitado ↓

Todavía no hay mensajes. ¡Sé el primero en participar!