В первые дни спецификации EJB сильно ухудшились, что привело к массовой миграции на такие платформы, как Spring и Hibernate. EJB1 не смог адекватно определить поля CMP в компоненте, EJB2 как бы подразумевал, что они должны быть абстрактными средствами доступа, а не фактическими полями, что было просто странно, и только в EJB3 было создано что-то близкое к тому, что все на самом деле хотели. К тому времени было уже слишком поздно, все считали, что EJB — отстой, и потребовались JCR JPA и JTA, чтобы снова все исправить.
EJB1 и 2 обычно вынуждали разработчика помещать всю свою конфигурацию постоянства в кучу файлов XML вдали от фактического кода, который ее использовал. Это приводит к путанице и ошибкам в коде. Другие фреймворки ORM извлекли уроки из этого и решили вместо этого использовать аннотации. Большая победа для них.
EJB1 и 2 имели очень ограниченную поддержку различных видов отношений и способов их реализации в лежащей в их основе реляционной базе данных. Приходилось использовать всевозможные специальные интерфейсы, и получившийся код было трудно понять.
В любом случае, все это в прошлом, и мы можем с нетерпением ждать светлого будущего, когда Hibernate реализует JPA и JTA. Все очень гармонично.