Ответ 1
Эти два совершенно разные.
EJB3
является составной моделью и не имеет непосредственного отношения к ORM. Это помогает легко управлять транзакциями и дает вам легкий доступ к диспетчеру сущности из JPA, который является стандартизованным ORM-решением в Java EE.
Hibernate
(3) действительно является решением ORM, и, как это бывает, которое реализует JPA.
Таким образом, более логичный вопрос заключается в том, следует ли использовать стандартизированные интерфейсы JPA или напрямую использовать API ядра Hibernate. Тогда может возникнуть вопрос о том, использовать ли JPA отдельно или в сочетании с EJB 3.
Ответ немного зависит от того, что вам нужно в точности, но, как правило, использование JPA в сочетании с EJB 3 является самым простым решением. Использование автономной системы JPA или Hibernate требует гораздо более подробного кода, и вам необходимо вручную управлять транзакциями, что может быть больно.
JPA против Hibernate - еще одна дискуссия. JPA имеет преимущество от стандартизованных интерфейсов, поэтому больше разработчиков, скорее всего, будут с ним знакомы. С другой стороны, родные API-интерфейсы Hibernate всегда представляют собой супер-набор из JPA и, следовательно, предлагают больше возможностей.
Обычно разработчики основывают свой код на JPA, а затем используют некоторые аннотации Hibernate или вызовы API, где это имеет смысл. В 99,99% случаев поддерживается такое смешанное использование API.
Также обратите внимание, что Glassfish в комплекте с EclipseLink
, а не с Hibernate. EclipseLink сопоставим с Hibernate, но предшествует ему более десяти лет. Hibernate взял много из EclipseLink (тогда назывался TopLink).
См. также этот ответ, который я дал аналогичному вопросу: Доступ к таблице базы данных через JPA Vs. EJB в веб-приложении