Зачем использовать JPA вместо прямой записи SQL-запроса в файл Java (т. Е. Непосредственно в JDBC)? - PullRequest
47 голосов
/ 10 декабря 2010

Я читал несколько статей о том, что такое JPA (Java Persistent API) и какой поставщик его поддерживает (DataNucleus, JBoss Hibernate и т. Д.)

У меня нет опыта работы с ORM (объектно-реляционное сопоставление).

То, что я до сих пор делал, - это пишу свои собственные классы базы данных, используя DTO и DAO.Пока что я доволен тем, что у меня есть, но хотел бы знать , почему люди используют JPA поверх файла Java, который содержит SQL .

Мне кажется, что писать класс DAO было бы неплохо, как показано ниже.

public class DAOUsers {
     public void insertNewUser(DTO DtoUser) {
           String query = "INSERT INTO users(username, address) " +
                          "VALUES(DtoUser.username , DtoUser.address)";
           Executor.run(query);
     }

}

Я узнал, что JPA использует JPQL, постоянный язык запросов Java, и он работает против объекта сущности, а ненепосредственно с таблицами БД.

Мое понимание (поправьте меня, если я ошибаюсь) состоит в том, что объект сущности здесь такой же, как мой объект DTO (вроде бина?)

Но как бы то ни было ... что действительно дает JPA над написаниемчистый SQL в моем файле?Похоже, я использую аннотации, требуемые JPA, и делает SQL нечитабельным для меня, кажется, не очень привлекательным для меня.

Ответы [ 6 ]

39 голосов
/ 10 декабря 2010

Зачем использовать JPA вместо прямой записи SQL-запроса в файл Java (т. Е. Непосредственно в JDBC)?

В некоторых проектах инженеры должны сосредоточиться на объектной модели, а не на фактическойSQL-запросы, используемые для доступа к хранилищам данных.Вопрос на самом деле можно интерпретировать как

Почему следует использовать структуру ORM?

, которая может иметь разные ответы в разных контекстах.

Большинство проектовможет быть полезна модель предметной области, а второстепенное значение имеет постоянство.С JPA (реализациями) или большинством других сред ORM возможно иметь все сущности, то есть таблицы в вашей базе данных, смоделированные как классы в Java.Кроме того, также возможно встроить поведение в эти классы и, следовательно, создать модель поведения, обогащенную поведением.Сущности в этой модели могут иметь несколько целей, в том числе замену DTO для передачи данных между уровнями.

Тем не менее, существуют места, в которых платформы ORM могут не подходить непосредственно к проблеме, особенно когдамодель данных уже установлена ​​или когда кто-то работает с устаревшими системами, где сопоставление таблиц базы данных с классами Java является нетривиальным упражнением.И в некоторых случаях, если нужно полностью отключить SQL, генерируемый платформой ORM, тогда ORM-фреймы обычно плохо подходят.

Связанные вопросы

  1. Архитектура Java EE - DAO по-прежнему рекомендуется при использовании ORM, например JPA 2?
  2. Использование ORM или простого SQL?
  3. ORM против уровня доступа к данным с ручным кодированием
23 голосов
/ 10 декабря 2010

Что действительно дает JPA над написанием чистого SQL в моем файле?

Вот некоторые из преимуществ:

  • JPA позволяет избежать написания DDL на специфическом для базы данных диалекте SQL. Вместо этого вы пишете «отображения» в XML или используя аннотации Java.

  • JPA позволяет избежать написания DML на специфическом для базы данных диалекте SQL.

  • JPA позволяет загружать и сохранять объекты и графики Java без какого-либо языка DML.

  • Когда вам нужно выполнять запросы, JPQL позволяет выражать запросы в терминах сущностей Java, а не (собственных) таблиц и столбцов SQL.

Вообще говоря, JPA проще, чище и менее трудоемок, чем JDBC + SQL + рукописные отображения. Чем сложнее ваша модель данных, тем более она полезна.

Тем не менее, если производительность является приоритетной , JPA имеет тенденцию мешать, добавляя слои между вашим приложением и базой данных. Если ваше приложение требует, чтобы вы тщательно оптимизировали запросы и схемы собственных баз данных для максимизации производительности, JPA, вероятно, не подходит.

JPA, вероятно, также не для вас, если вам гораздо удобнее манипулировать Java, JDBC и SQL в одном приложении, чем разрешать ORM разбираться со сложными деталями. (Но если вы есть, вы, вероятно, в меньшинстве ...)

14 голосов
/ 23 июля 2017

Хотя это старый вопрос, я чувствую, что он заслуживает нового ответа.Я недавно внедрил JPA, я использовал его в течение нескольких лет, и хотя у меня были моменты впечатления от простоты установки нового приложения, я совершенно не впечатлилсяс производительностью, сложностью и кривой обучения, необходимой для правильного выполнения JPA.Ответы в этой теме на самом деле подтверждают мою позицию.

Во-первых, @vineet предлагает "сущности могут иметь несколько целей" ... что я видел в работе, и я бы сказал, что это поощряется ORM.Так много для сплоченности и единого принципала ответственности.По моему опыту, добавление поведения к объектам базы данных вызывает проблемы.Я знаю это, потому что я сделал это и жил, чтобы сожалеть об этом.

Во-вторых, существуют простые альтернативы сложности JPA, которые предоставляют возможность использовать классы с RDBMS без всякой тяжести (и производительности).проблемы), вызванные несоответствием, которое ORM пытается (безуспешно) решить.Мы использовали инструменты отображения реляционных классов не JPA в течение десятилетия в приложении с более чем 1000 таблицами, и мы просто не видим, как JPA является улучшением по сравнению с более прямым доступом к базе данных.JPA скрывает мощь базы данных, добавляя дополнительные данные (в форме аннотаций и JQL) к модели классов ... разве это не должно работать по-другому?

@ water предлагает множество вещей, которые верны втеория, но неосуществимая в реальности.Например, переключив базы данных три раза, я могу заверить читателей, что нет такой вещи, как несколько настроек конфигурации, и все готово.Я бы посоветовал, если вы тратите много времени на поддержание своего уровня персистентности, ваша модель базы данных развивается, и вы будете выполнять ту же или более работу в JPA.Особенно, когда нетривиальные запросы в JPA требуют использования JQL!

Почти все делают вид, что разработчикам JPA не нужно знать SQL.Что я видел на практике, так это то, что теперь мы должны изучать SQL и JQL.Очевидно, нам не нужно делать DDL - но в любом нетривиальном приложении , конечно, , вам нужно знать DDL.Hibernate даже не рекомендует использовать автоматическую генерацию DDL.По-видимому, нам не нужно делать DML, за исключением случаев, когда мы обращаемся к собственному запросу, который, конечно, непереносим, ​​разбивает кэш и имеет все те же проблемы, что и JDBC ...

В конечном счетеВ правильно структурированном приложении, в котором модель предметной области не зависит от бизнес-логики, JPA предоставляет мало функциональных возможностей для того, что я считаю очень высокой степенью обучения - потому что модель предметной области на самом деле очень легко построить.Я бы не стал использовать JDBC напрямую, но что-то вроде Apache DBUtils предоставляет простой уровень над JDBC, который отображает строки в объекты, и, приложив немного усилий, может обеспечить большинство преимуществ JPA без каких-либо скрытий и никаких накладных расходов.

Я разрабатывал приложения баз данных Java начиная с JDBC 1.0, используя различные библиотеки (и iODBC и ESQL до JDBC), и только по соображениям производительности я закончил с JPA.Но даже если бы производительность была лучше, кривая обучения и неполные абстракции дают мне серьезную паузу.JPA сложен и пытается скрыть детали, которые, на мой взгляд, разработчики действительно должны заботиться.В качестве примера, мы недавно увидели спящий выпуск 250 команд удаления в базу данных, когда их будет достаточно.JPA по своей природе облегчает подобные ошибки.

Я не защищаю JDBC, я просто выступаю против JPA.Разработчики, которые не работают или не могут работать в SQL, вероятно, не должны писать реляционные приложения - так же, как разработчики, подобные мне, которые не могут заниматься матричной алгеброй, чтобы спасти мою жизнь, должны писать 3D-игры.Разработчики, которые используют SQL для жизни, должны быть в ужасе от искаженного SQL, который, например, отправляет в спящий режим на сервер, чтобы избежать циклических переходов, которые не должны быть в первую очередь необходимыми.

6 голосов
/ 10 декабря 2010

Как все мы знаем, что объект является одним из самых важных вещей в нашей жизни, и в программировании объекта это очень простой способ упростить любую проблему .... и если объект доступен там, то почему мы используем целую вещь вместо этого маленькогочасть этой вещи означает объект ....

  • если вы вручную кодируете операторы SQL в своем корпоративном приложении, вы тратите значительную часть своего времени на обновление и поддержание уровня персистентности.

В постоянном значении ==> больше не требуется API JDBC для набора результатов или обработки данных.==> Это помогает сократить количество строк кода, &&&&&& ==> Это абстрагирует наше приложение от базовой базы данных SQL и SQL-диалекта.Переключение на другую базу данных SQL требует нескольких изменений в файле конфигурации Hibernate (однократная запись / запуск в любом месте).

6 голосов
/ 10 декабря 2010

Если все сделано правильно, вы можете отобразить запросы SQL напрямую в объекты Java с помощью реализаций JPA, таких как hibernate.Недавно я выполнил проект, в котором у меня были POJO и 3 или 4 аннотации и немного кода установки, чтобы взять хранимую процедуру и отобразить ее непосредственно в список объектов (типа класса POJO).Это для меня является частью власти JPA.

Если вы используете его так, как если бы вы работали с SQL + JDBC, я не знаю никаких преимуществ.

Приличная статья здесь о преимуществах JPA.

Надеюсь, это поможет.

0 голосов
/ 01 августа 2012

Кроме того, как вы знаете, слоган Java: «Пиши один раз, беги везде»

Также с JPQL вы можете выполнять свои запросы JPQL для каждой базы данных (DB2, Oracle и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...