Это довольно открытый вопрос. Я начну новый проект и рассмотрю различные ORM для интеграции с доступом к базе данных.
У тебя есть любимые? Есть ли что-нибудь, что вы бы посоветовали держаться подальше?
Это довольно открытый вопрос. Я начну новый проект и рассмотрю различные ORM для интеграции с доступом к базе данных.
У тебя есть любимые? Есть ли что-нибудь, что вы бы посоветовали держаться подальше?
Ответы:
Я перестал использовать ORM.
Причина не в каком-либо большом недостатке концепции. Hibernate работает хорошо. Вместо этого я обнаружил, что запросы имеют низкие накладные расходы, и я могу вписать много сложной логики в большие запросы SQL и перенести большую часть своей обработки в базу данных.
Так что подумайте только об использовании пакета JDBC.
Нет, потому что наличие ORM отнимает слишком много контроля с небольшими преимуществами. Полученная экономия времени легко сходит на нет, если вам необходимо отладить отклонения, возникающие в результате использования ORM. Кроме того, ORM не позволяют разработчикам изучать SQL и принципы работы реляционных баз данных и использовать их в своих интересах.
Многие ORM великолепны, вам нужно знать, почему вы хотите добавить абстракцию поверх JDBC. Я могу порекомендовать вам http://www.jooq.org (отказ от ответственности: я создатель jOOQ, поэтому этот ответ предвзят). JOOQ охватывает следующую парадигму:
Есть много других хороших ORM. Особенно Hibernate или iBATIS имеют отличное сообщество. Но если вы ищете интуитивный, простой, я скажу попробовать JOOQ. Тебе это понравится! :-)
Проверьте этот пример SQL:
// Select authors with books that are sold out
SELECT *
FROM T_AUTHOR a
WHERE EXISTS (SELECT 1
FROM T_BOOK
WHERE T_BOOK.STATUS = 'SOLD OUT'
AND T_BOOK.AUTHOR_ID = a.ID);
И как это можно выразить в jOOQ:
// Alias the author table
TAuthor a = T_AUTHOR.as("a");
// Use the aliased table in the select statement
create.selectFrom(a)
.whereExists(create.selectOne()
.from(T_BOOK)
.where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
.and(T_BOOK.AUTHOR_ID.equal(a.ID))))));
Hibernate, потому что это в основном стандарт де-факто в Java и был одной из движущих сил в создании JPA. Он получил отличную поддержку в Spring, и почти каждая инфраструктура Java поддерживает его. Наконец, GORM - это действительно классная оболочка, которая делает динамические поиски и так далее, используя Groovy.
Он даже был портирован на .NET (NHibernate), так что вы также можете использовать его там.
Спящий, потому что это:
Несколько моментов о том, почему (и когда) использовать ORM:
Я бы порекомендовал использовать MyBatis . Это тонкий слой поверх JDBC, очень легко отображать объекты в таблицы и при этом использовать простой SQL, все находится под вашим контролем.
У меня был действительно хороший опыт работы с Avaje Ebean когда я писал приложение JavaSE среднего размера.
Он использует стандартные аннотации JPA для определения сущностей, но предоставляет гораздо более простой API (без EntityManager или какой-либо другой хрени с присоединенными / отсоединенными сущностями). Это также позволяет вам легко использовать SQL-запросы или простые JDBC-вызовы при необходимости.
Он также имеет очень приятный и безопасный API для запросов. Вы можете написать такие вещи, как:
List<Person> boys = Ebean.find(Person.class)
.where()
.eq("gender", "M")
.le("age", 18)
.orderBy("firstName")
.findList();
SimpleORM , потому что это просто и без магии. Он определяет все структуры метаданных в коде Java и является очень гибким.
SimpleORM предоставляет функциональность, аналогичную Hibernate, путем сопоставления данных в реляционной базе данных с объектами Java в памяти. Запросы могут быть заданы в терминах объектов Java, идентичность объекта совпадает с ключами базы данных, отношения между объектами поддерживаются, а измененные объекты автоматически сбрасываются в базу данных с оптимистическими блокировками.
Но, в отличие от Hibernate, SimpleORM использует очень простую объектную структуру и архитектуру, которая позволяет избежать необходимости сложного анализа, обработки байтового кода и т. Д. SimpleORM является небольшим и прозрачным, упакован в две банки размером всего 79 КБ и 52 КБ, с одной маленькой и опциональной зависимость (Slf4j). (Hibernate более 2400K плюс около 2000K зависимых JAR-файлов.) Это упрощает понимание SimpleORM и значительно снижает технический риск.
Eclipse Link , по многим причинам, но особенно я чувствую, что у него меньше вздутия, чем у других решений основного потока (по крайней мере, меньше вздутие живота)
Ох, и Eclipse Link была выбрана в качестве эталонной реализации для JPA 2.0
Хотя я разделяю озабоченность по поводу замены Java для запросов SQL в свободной форме, я действительно думаю, что люди, критикующие ORM, делают это из-за в целом плохого дизайна приложений.
Истинный OOD определяется классами и отношениями, а ORM обеспечивает согласованное отображение различных типов отношений и объектов. Если вы используете инструмент ORM и в конечном итоге кодируете выражения запросов на любом языке запросов, поддерживаемом платформой ORM (включая, помимо прочего, деревья выражений Java, методы запросов, OQL и т. Д.), Вы определенно делаете что-то неправильно, то есть модель вашего класса. скорее всего, не поддерживает ваши требования так, как должно. Чистый дизайн приложения на самом деле не требует запросов на уровне приложения. Я проводил рефакторинг многих проектов, которые люди начинали использовать ORM-фреймворк так же, как они использовались для встраивания строковых констант SQL в их код, и в итоге все были удивлены тем, насколько простым и понятным становится все приложение, когда вы соответствуете до модели вашего класса с моделью использования. Конечно, для таких вещей, как функциональность поиска и т. Д. Вам нужен язык запросов, но даже в этом случае запросы настолько ограничены, что создание даже сложного VIEW и отображение его на постоянный класс, доступный только для чтения, гораздо приятнее поддерживать и смотреть, чем создавать выражения на некотором языке запросов в коде вашего приложения. Подход VIEW также использует возможности базы данных и, благодаря материализации, может быть намного лучше с точки зрения производительности, чем любой рукописный SQL в вашем источнике Java. Таким образом, я не вижу никакой причины для нетривиального приложения НЕ использовать ORM. но даже в этом случае запросы настолько ограничены, что создание даже сложного VIEW и отображение его на постоянный класс, доступный только для чтения, гораздо приятнее в обслуживании и взгляде, чем построение выражений на каком-либо языке запросов в коде вашего приложения. Подход VIEW также использует возможности базы данных и, благодаря материализации, может быть намного лучше с точки зрения производительности, чем любой рукописный SQL в вашем источнике Java. Таким образом, я не вижу никакой причины для нетривиального приложения НЕ использовать ORM. но даже в этом случае запросы настолько ограничены, что создание даже сложного VIEW и отображение его на постоянный класс, доступный только для чтения, гораздо приятнее в обслуживании и взгляде, чем построение выражений на каком-либо языке запросов в коде вашего приложения. Подход VIEW также использует возможности базы данных и, благодаря материализации, может быть намного лучше с точки зрения производительности, чем любой рукописный SQL в вашем источнике Java. Таким образом, я не вижу никакой причины для нетривиального приложения НЕ использовать ORM.