It is because
EJB containers provide more functionalities than those technologies you had specified. For example, in case there is an exception involved a series of DB operations, if one of them has been failed, the whole transaction should be rollback. Then, you have to code for handling such events. For EJB, containers will cater all stuffs for you.
Although it is very complex, EJB 3.0 has tried to simplify EJB via POJO and make use of the idea of Hibernate. Let's see the improvement of the new EJB generation.
Nick
SCJP 1.2, OCP 9i DBA, SCWCD 1.3, SCJP 1.4 (SAI), SCJD 1.4, SCWCD 1.4 (Beta), ICED (IBM 287, IBM 484, IBM 486), SCMAD 1.0 (Beta), SCBCD 1.3, ICSD (IBM 288), ICDBA (IBM 700, IBM 701), SCDJWS, ICSD (IBM 348), OCP 10g DBA (Beta), SCJP 5.0 (Beta), SCJA 1.0 (Beta), MCP(70-270), SCBCD 5.0 (Beta), SCJP 6.0, SCEA for JEE5 (in progress)