Это довольно открытый вопрос. Я начинаю новый проект и ищу различные ORM для интеграции с доступом к базе данных.
У тебя есть любимые? Есть ли что-нибудь, от чего вы бы посоветовали держаться подальше?
Взгляните на микроорганизмы - тонкие оболочки вокруг технологии доступа к БД платформы - например, sql2o для Java github.com/aaberg/sql2o или ServiceStack.OrmLite для .NET github.com/ServiceStack/ServiceStack.OrmLite
После использования ORM более 5 лет мой личный выбор - Spring JDBC вместо ORM, а вторым лучшим является iBatis (MyBatis). Мне не нравится спящий режим из-за кривой обучения, меньшего контроля и проблем с производительностью.
Вот (также закрытый) список легких оболочек jdbc, которые можно использовать в качестве альтернативы полнофункциональным организациям: stackoverflow.com/questions/7137929/…




Hibernate, потому что он фактически является стандартом Java и был одной из движущих сил при создании JPA. У него отличная поддержка в Spring, и почти каждая среда Java поддерживает его. Наконец, GORM - это действительно классная оболочка для выполнения динамических поисковиков и т. д. С использованием Groovy.
Он даже был перенесен на .NET (NHibernate), так что вы можете использовать его и там.
Я тоже голосую за Hib, но с важным дополнением: мы должны использовать JPA API Только, даже если реализация JPA фактически предоставляется Hib.
SimpleORM, потому что это прямолинейно и без магии. Он определяет все структуры метаданных в Java-коде и очень гибок.
SimpleORM provides similar functionality to Hibernate by mapping data in a relational database to Java objects in memory. Queries can be specified in terms of Java objects, object identity is aligned with database keys, relationships between objects are maintained and modified objects are automatically flushed to the database with optimistic locks.
But unlike Hibernate, SimpleORM uses a very simple object structure and architecture that avoids the need for complex parsing, byte code processing etc. SimpleORM is small and transparent, packaged in two jars of just 79K and 52K in size, with only one small and optional dependency (Slf4j). (Hibernate is over 2400K plus about 2000K of dependent Jars.) This makes SimpleORM easy to understand and so greatly reduces technical risk.
Не использовал его, но ActiveObjects на своем веб-сайте описывает себя как своего рода Hibernate-lite, так что, вероятно, есть некоторое сходство.
Eclipse Link, по многим причинам, но, в частности, мне кажется, что он имеет меньше раздувания, чем другие решения основного потока (по крайней мере, меньше раздувания на вашем лице).
О, и Eclipse Link был выбран в качестве эталонной реализации для JPA 2.0.
Я перестал использовать ORM.
Причина не в большом недостатке концепции. Hibernate работает хорошо. Вместо этого я обнаружил, что запросы имеют низкие накладные расходы, и я могу уместить много сложной логики в большие запросы SQL и перенести большую часть своей обработки в базу данных.
Так что рассмотрите возможность использования пакета JDBC.
С ORM снова и снова повторяется одна и та же история: хорошая быстрая начальная разработка и большая утечка ваших ресурсов в дальнейшем в проекте при отслеживании ошибок и неэффективности, связанных с ORM. Я также ненавижу тот факт, что это, кажется, дает разработчикам представление о том, что им никогда не нужно писать определенные оптимизированные запросы.
Эй, это все верно для больших проектов из реальной жизни?
Я согласен. Я использую ORM более 3 лет, и я не могу сказать, сколько времени было потрачено (до сих пор) на решение проблем, связанных с постоянством. У нас нет никакого контроля над тем, что происходит «под капотом», конфигураций слишком много, чтобы ими можно было эффективно управлять, и есть поведения, которые могут свести с ума. С другой стороны, у меня есть поддержка основных баз данных, и мне не нужно беспокоиться об их различиях.
Как вы сопоставляете строки таблицы с объектами Java? Вы используете сеттеры для установки каждого значения для каждого объекта? Всегда создавать select * from User; а затем вручную сопоставить каждый атрибут пользователя с вашим Java-объектом?
почему бы не использовать оба варианта, в зависимости от сложности запроса / транзакции? они не исключают друг друга.
@santiagobasulto и другие, хотя ORM может не работать для Java, я могу засвидетельствовать, что он действительно работает для больших реальных проектов на других языках, например Perl с использованием DBIx :: Class.
@WillSheppard да Уилл. Я довольно часто использую Django ORM, и он отлично работает. Я думаю, что разница может заключаться в динамической природе Python (и Perl). Использование ORM в Java - это боль. Но в динамических языках это может быть действительно выразительно. Есть несколько отличных проектов для встраивания операций ORM, таких как DSL в Python, и они великолепны.
Не знаю, я использую новейшую версию Hibernate, и мне не приходилось много с ней бороться, и у меня также есть возможность писать запросы на HQL, так что это дает мне лучшее из обоих миров, насколько я могу я обеспокоен. Я исхожу из того, что много лет писал свои собственные простые оболочки на JDBC.
Итак, вы написали свои собственные репозитории с транзакциями, sql-запросами, сопоставлением объектов, отслеживанием изменений, отложенной загрузкой, миграциями, связями и объединениями? Прохладный. Вы написали собственный ORM.
Интересно, верен ли этот ответ с учетом кеширования.
Согласовано. Это легко, но через некоторое время мы страдаем из-за их недостатков.
Что вы делаете, когда вам нужно сменить поставщика БД?
Я согласен с вами. ORM Hibernate выглядит тяжелым и негибким. Очень сложно выполнять сложные запросы для отчетов. Я чувствую себя свободно и комфортно при использовании MyBatis или JDBC, потому что я могу сопоставить все, что мне нравится, а также это почти простой SQL.
Я предпочитаю ORM, что-нибудь не тяжелое (например, mybatis). Вся логика написана в хранимых процедурах, но вызов базы данных проходит через ORM. Я использую ORM как механизм для передачи аргументов в базу данных. Это очень эффективно, когда мы передаем список массивов в качестве аргумента при вызове базы данных.
@amphibient Я с тобой согласен. Почему бы просто не использовать оба подхода и не объединить преимущества каждого из них? Я предполагаю, что основная причина ORM не в том, чтобы делать все, а в том, чтобы просто делать часть, которая проста, должна быть более управляемой и повторяющейся. Другие сложные вещи должны использовать JDBC и писать запросы напрямую!
Нет, потому что наличие ORM отнимает слишком много контроля с небольшими преимуществами. Полученная экономия времени легко сдувается, когда вам нужно отлаживать отклонения, возникающие в результате использования ORM. Кроме того, ORM отговаривают разработчиков от изучения SQL и того, как работают реляционные базы данных, и от использования этого в своих интересах.
Я согласен с этим утверждением. Сколько из общего времени разработки будет потрачено на написание кода постоянства? Думаю менее 10-15%
По-разному. Конечно, если вы используете только один конкретный вид базы данных, легко обойтись без использования ORM. Однако, когда вам нужно поддерживать другие типы баз данных, она может быстро стать менее управляемой.
«Полученная экономия времени легко сдувается, когда вам нужно отлаживать отклонения, возникающие в результате использования ORM». Это неверно, когда кривая навыков является достойным фактором при выборе технологий.
Ваш аргумент может быть выдвинут против использования какой-либо библиотеки. Самые большие преимущества ORM - это такие вещи, как единицы работы, сопоставление объектов, отслеживание изменений, отложенная загрузка, миграции и отношения. Замечательно иметь возможность писать user.profile.givenName и не заботиться о том, какая структура использовалась для хранения данных для него.
Его можно было использовать против любой библиотеки, но в разной степени. Вообще я большой сторонник использования библиотек - зачем изобретать колесо? Однако в этом случае я считаю, что Hibernate для большинства применений слишком тяжелый, и более легкий ORM был бы более предпочтительным. Мой опыт основан на многолетнем опыте разработки с Hibernate и тщательном изучении его тонкостей.
Боже мой, мне жаль разработчиков Java. Не используете ORM? Но, может быть, вы правы, я был бы удивлен, если какая-либо библиотека будет корректно работать в мире Java, и вам придется настроить 176 различных свойств.
У меня был действительно хороший опыт работы с Авахе Эбеан, когда я писал приложение JavaSE среднего размера.
Он использует стандартные аннотации JPA для определения сущностей, но предоставляет гораздо более простой API (без EntityManager или какой-либо из этих прикрепленных / отсоединенных сущностей). Он также позволяет при необходимости легко использовать SQL-запросы или обычные вызовы JDBC.
Он также имеет очень приятный гибкий и безопасный по типу API для запросов. Вы можете написать что-то вроде:
List<Person> boys = Ebean.find(Person.class)
.where()
.eq("gender", "M")
.le("age", 18)
.orderBy("firstName")
.findList();
Я, должно быть, немного странно ... выберите Person, где пол = 'M' и возраст <18, упорядоченный по firstName, мне кажется, намного лучше :-)
Это одна из лучших команд, которые я видел в java. Решение использовать синглтон освежает и дает ему огромное практическое преимущество перед другими.
Я думаю, вы имеете в виду, что беглый не жидкий.
@opsb Я думаю, что технически это моногосударство, а не синглтон.
Как начать работу с Avaje Ebean ORM? Любые видеоуроки ??
Спящий режим, потому что это:
Несколько моментов о том, почему (и когда) использовать ORM:
Когда я сравниваю Hibernate и JPA, я выбираю Hibernate, а если сравниваю JPA и JDO, я выбираю JDO! Мне очень нравится JDO, но мне нравятся две функции Hibernate (которые недоступны в JDO): одна - это @Filters, а другая - вы можете отображать поля версии (для оптимистической блокировки) в обычные поля, что невозможно в JDO. .
Я бы рекомендовал использовать MyBatis. Это тонкий слой поверх JDBC, очень легко сопоставить объекты с таблицами и при этом использовать простой SQL, все под вашим контролем.
Ibatis для сложных операций чтения, а спящий режим для создания, обновления, удаления и простого чтения - идеальный выбор.
Многие 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))))));
Инструменты ORM настолько хороши, насколько вы умеете их правильно использовать. Есть проекты, в которых инструменты ORM работают как чудо, а в других они совсем не подходят. В конце концов, ответственность за выбор инструмента, соответствующего требованиям проекта, лежит на команде разработчиков. Инструменты ORM сложны. К сожалению, лишь часть разработчиков потратит время на то, чтобы понять, как они работают. Остальные будут просто винить инструмент и говорить, что он плохой. Возникает вопрос: дает ли ответ, получивший наибольшее количество голосов, лучший совет? > Так что рассмотрите возможность использования пакета JDBC. Мы действительно хотим использовать простой JDBC?
Я стараюсь не позволять «База данных на первом месте». Приложение содержит бизнес-правила для функций, которые запрашивает клиент, и они почти никогда не запрашивают создание базы данных. Это техническая деталь, определяемая во время реализации.
Хотя я разделяю озабоченность по поводу замены Java для запросов SQL произвольной формы, я действительно думаю, что люди, критикующие ORM, делают это из-за в целом плохого дизайна приложения.
Истинный OOD управляется классами и отношениями, а ORM дает вам согласованное сопоставление различных типов отношений и объектов. Если вы используете инструмент ORM и в конечном итоге кодируете выражения запроса на любом языке запросов, поддерживаемом инфраструктурой ORM (включая, помимо прочего, деревья выражений Java, методы запросов, OQL и т. д.), Вы определенно делаете что-то неправильно, то есть ваша модель класса скорее всего, не поддерживает ваши требования так, как должно. Чистый дизайн приложения на самом деле не требует запросов на уровне приложения. Я проводил рефакторинг многих проектов, которые люди начинали с использования ORM-фреймворка, точно так же, как они использовались для встраивания строковых констант SQL в свой код, и в конце концов все были удивлены тем, насколько простым и удобным в обслуживании становится все приложение, когда вы подходите. улучшите модель вашего класса с помощью модели использования. Конечно, для таких вещей, как функции поиска и т. д. Вам нужен язык запросов, но даже в этом случае запросы настолько ограничены, что создание даже сложного VIEW и сопоставление его с постоянным классом только для чтения намного удобнее поддерживать и смотреть, чем создавать выражения на каком-то языке запросов в коде вашего приложения. Подход VIEW также использует возможности базы данных и, благодаря материализации, может быть намного лучше с точки зрения производительности, чем любой написанный вручную SQL в вашем исходном коде Java. Итак, я не вижу причин, по которым нетривиальное приложение НЕ использует ORM.
Если вы создаете приложения на основе постоянного хранилища, как это делают многие из нас, будь то СУБД или какой-то вариант NoSQL, у этого хранилища будет собственный эффективный способ доступа к нему. Пытаться абстрагироваться от этого слишком многого - это просто чрезмерная инженерия. Чрезмерное рвение к «истинному ООД» приводит к тем архитектурам астронавтов, которыми печально известна Java.
См. Следующие важные вопросы по теме: stackoverflow.com/questions/494816/using-an-orm-or-plain-sql /…stackoverflow.com/questions/716532/…