Работая в проекте среднего размера в течение последних 4 месяцев - мы используем JPA и Spring - я совершенно уверен, что JPA недостаточно эффективен для проектов, требующих большего, чем экран CRUD... Интерфейс запросов плохой, Hibernate не уважает JPA spec все время и много раз мне нужно использовать классы гибернации, аннотации и конфигурацию. Ребята, что вы думаете о JPA? Разве это не достаточно хорошо?
JPA 1 недостаточно хорош
Ответы (7)
Ну, я думаю, что в большинстве случаев JPA «достаточно хорош», но я очень скучаю по Criteria API (предоставляется только Hibernate).
Hibernate долгое время находился в пути. Вот почему у него есть много функций, недоступных в JPA. Но со временем JPA наверстает упущенное. До тех пор используйте специальные настройки JPA и Hibernate, где это необходимо. Если вам нужно будет переключиться позже, это будет намного проще.
Ну, я не могу дать конкретные рекомендации, не зная больше о вашем конкретном случае. Похоже, вы используете реализацию Hibernate JPA. Вы можете попробовать другие реализации JPA, если вам что-то не нравится в Hibernate. Что касается интерфейса запроса, если запросы JPA не делают то, что вы хотите, у вас всегда есть возможность получить простое старое соединение и работать с ним. Гениальность фреймворка в том, что, по крайней мере, вам больше не нужно писать весь CRUD-код. Я бы никогда не стал утверждать, что JPA совершенен, но это лучше, чем все время писать вручную SQL для выполнения тривиальных задач.
Мы объединяем JPA 2.0, Hibernate Core, Hibernate Search и Hibernate Validator через нашу внутреннюю оболочку. Он делает все, что мы ему бросаем :)
Объедините это с Maven, и у нас тоже есть база данных! Добавьте к этому DBUnit, и вы получите все, что вам нужно.
Безумно быстрый поиск через Lucene, но использование запросов Hibernate Criteria/HQL — это очень круто. Вся эта сила, стоящая за блоком предложений GWT, великолепна.
Мой совет будет просто использовать Hibernate. Hibernate в сочетании с аннотациями JPA + аннотации Hibernate довольно эффективны. Вы даже можете настроить EntityManagerFactory для автоматического обнаружения сущностей в пути к классам, а затем вызвать getSessionFactory(), чтобы использовать собственные API-интерфейсы Hibernate в вашем приложении. Если вы используете Spring, это очень легко сделать с помощью LocalContainerEntityManagerFactoryBean и HibernateJpaVendorAdapter.
Конечно, любой ORM лучше, чем рукописный SQL для операций CRUD ... дело в том, что я думаю, что нет причин использовать JPA вместо чистого Hibernate, потому что я много смешиваю оба. Если я не получаю скрытого провайдера, зачем все равно использовать JPA?
Одной из приятных особенностей использования аннотаций JPA и Hibernate является автоматическая настройка и обнаружение постоянных классов. Кроме того, это зависит от того, сколько времени вам нужно отказаться от использования JPA API, если вы делаете это только 10% времени, это все равно сделает переключение провайдеров намного проще, чем если бы вы использовали спящий режим для 100 % ваших запросов.