Какую Java ORM вы предпочитаете и почему?

Это довольно открытый вопрос. Я начинаю новый проект и ищу различные ORM для интеграции с доступом к базе данных.

У тебя есть любимые? Есть ли что-нибудь, от чего вы бы посоветовали держаться подальше?

См. Следующие важные вопросы по теме: stackoverflow.com/questions/494816/using-an-orm-or-plain-sql‌ /…stackoverflow.com/questions/716532/…

ripper234 21.11.2010 21:56

Взгляните на микроорганизмы - тонкие оболочки вокруг технологии доступа к БД платформы - например, sql2o для Java github.com/aaberg/sql2o или ServiceStack.OrmLite для .NET github.com/ServiceStack/ServiceStack.OrmLite

tomaszkubacki 09.08.2013 18:14

После использования ORM более 5 лет мой личный выбор - Spring JDBC вместо ORM, а вторым лучшим является iBatis (MyBatis). Мне не нравится спящий режим из-за кривой обучения, меньшего контроля и проблем с производительностью.

user4948585 04.08.2015 15:49

Вот (также закрытый) список легких оболочек jdbc, которые можно использовать в качестве альтернативы полнофункциональным организациям: stackoverflow.com/questions/7137929/…

Vadzim 11.05.2017 16:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
274
4
221 693
10

Ответы 10

Hibernate, потому что он фактически является стандартом Java и был одной из движущих сил при создании JPA. У него отличная поддержка в Spring, и почти каждая среда Java поддерживает его. Наконец, GORM - это действительно классная оболочка для выполнения динамических поисковиков и т. д. С использованием Groovy.

Он даже был перенесен на .NET (NHibernate), так что вы можете использовать его и там.

Я тоже голосую за Hib, но с важным дополнением: мы должны использовать JPA API Только, даже если реализация JPA фактически предоставляется Hib.

Vladimir Dyuzhev 17.01.2009 04:24

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, так что, вероятно, есть некоторое сходство.

Abdullah Jibaly 17.01.2009 08:01

Eclipse Link, по многим причинам, но, в частности, мне кажется, что он имеет меньше раздувания, чем другие решения основного потока (по крайней мере, меньше раздувания на вашем лице).

О, и Eclipse Link был выбран в качестве эталонной реализации для JPA 2.0.

Я перестал использовать ORM.

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

Так что рассмотрите возможность использования пакета JDBC.

С ORM снова и снова повторяется одна и та же история: хорошая быстрая начальная разработка и большая утечка ваших ресурсов в дальнейшем в проекте при отслеживании ошибок и неэффективности, связанных с ORM. Я также ненавижу тот факт, что это, кажется, дает разработчикам представление о том, что им никогда не нужно писать определенные оптимизированные запросы.

Eelco 29.05.2010 10:52

Эй, это все верно для больших проектов из реальной жизни?

santiagobasulto 05.10.2010 06:13

Я согласен. Я использую ORM более 3 лет, и я не могу сказать, сколько времени было потрачено (до сих пор) на решение проблем, связанных с постоянством. У нас нет никакого контроля над тем, что происходит «под капотом», конфигураций слишком много, чтобы ими можно было эффективно управлять, и есть поведения, которые могут свести с ума. С другой стороны, у меня есть поддержка основных баз данных, и мне не нужно беспокоиться об их различиях.

marcolopes 05.03.2011 16:03

Как вы сопоставляете строки таблицы с объектами Java? Вы используете сеттеры для установки каждого значения для каждого объекта? Всегда создавать select * from User; а затем вручную сопоставить каждый атрибут пользователя с вашим Java-объектом?

newbie 21.09.2012 12:54

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

amphibient 10.11.2012 00:01

@santiagobasulto и другие, хотя ORM может не работать для Java, я могу засвидетельствовать, что он действительно работает для больших реальных проектов на других языках, например Perl с использованием DBIx :: Class.

Will Sheppard 26.04.2013 18:43

@WillSheppard да Уилл. Я довольно часто использую Django ORM, и он отлично работает. Я думаю, что разница может заключаться в динамической природе Python (и Perl). Использование ORM в Java - это боль. Но в динамических языках это может быть действительно выразительно. Есть несколько отличных проектов для встраивания операций ORM, таких как DSL в Python, и они великолепны.

santiagobasulto 26.04.2013 23:04

Не знаю, я использую новейшую версию Hibernate, и мне не приходилось много с ней бороться, и у меня также есть возможность писать запросы на HQL, так что это дает мне лучшее из обоих миров, насколько я могу я обеспокоен. Я исхожу из того, что много лет писал свои собственные простые оболочки на JDBC.

Kenny Cason 13.03.2014 04:48

Итак, вы написали свои собственные репозитории с транзакциями, sql-запросами, сопоставлением объектов, отслеживанием изменений, отложенной загрузкой, миграциями, связями и объединениями? Прохладный. Вы написали собственный ORM.

Alex 12.05.2014 10:13

Интересно, верен ли этот ответ с учетом кеширования.

Ben George 04.07.2014 13:42

Согласовано. Это легко, но через некоторое время мы страдаем из-за их недостатков.

Viswanath Lekshmanan 03.11.2014 19:56

Что вы делаете, когда вам нужно сменить поставщика БД?

dbalakirev 05.01.2015 21:03

Я согласен с вами. ORM Hibernate выглядит тяжелым и негибким. Очень сложно выполнять сложные запросы для отчетов. Я чувствую себя свободно и комфортно при использовании MyBatis или JDBC, потому что я могу сопоставить все, что мне нравится, а также это почти простой SQL.

emeraldhieu 11.08.2015 05:58

Я предпочитаю ORM, что-нибудь не тяжелое (например, mybatis). Вся логика написана в хранимых процедурах, но вызов базы данных проходит через ORM. Я использую ORM как механизм для передачи аргументов в базу данных. Это очень эффективно, когда мы передаем список массивов в качестве аргумента при вызове базы данных.

MukeshKoshyM 15.03.2016 18:20

@amphibient Я с тобой согласен. Почему бы просто не использовать оба подхода и не объединить преимущества каждого из них? Я предполагаю, что основная причина ORM не в том, чтобы делать все, а в том, чтобы просто делать часть, которая проста, должна быть более управляемой и повторяющейся. Другие сложные вещи должны использовать JDBC и писать запросы напрямую!

HMD 04.11.2020 10:46

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

Я согласен с этим утверждением. Сколько из общего времени разработки будет потрачено на написание кода постоянства? Думаю менее 10-15%

adrian.tarau 25.11.2009 21:50

По-разному. Конечно, если вы используете только один конкретный вид базы данных, легко обойтись без использования ORM. Однако, когда вам нужно поддерживать другие типы баз данных, она может быстро стать менее управляемой.

Jason Baker 23.01.2010 19:26

«Полученная экономия времени легко сдувается, когда вам нужно отлаживать отклонения, возникающие в результате использования ORM». Это неверно, когда кривая навыков является достойным фактором при выборе технологий.

elsadek 01.05.2014 00:05

Ваш аргумент может быть выдвинут против использования какой-либо библиотеки. Самые большие преимущества ORM - это такие вещи, как единицы работы, сопоставление объектов, отслеживание изменений, отложенная загрузка, миграции и отношения. Замечательно иметь возможность писать user.profile.givenName и не заботиться о том, какая структура использовалась для хранения данных для него.

Alex 12.05.2014 10:17

Его можно было использовать против любой библиотеки, но в разной степени. Вообще я большой сторонник использования библиотек - зачем изобретать колесо? Однако в этом случае я считаю, что Hibernate для большинства применений слишком тяжелый, и более легкий ORM был бы более предпочтительным. Мой опыт основан на многолетнем опыте разработки с Hibernate и тщательном изучении его тонкостей.

simon 15.05.2014 18:02

Боже мой, мне жаль разработчиков Java. Не используете ORM? Но, может быть, вы правы, я был бы удивлен, если какая-либо библиотека будет корректно работать в мире Java, и вам придется настроить 176 различных свойств.

EralpB 23.01.2017 13:06

У меня был действительно хороший опыт работы с Авахе Эбеан, когда я писал приложение 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, мне кажется, намного лучше :-)

Eelco 29.05.2010 10:46

Это одна из лучших команд, которые я видел в java. Решение использовать синглтон освежает и дает ему огромное практическое преимущество перед другими.

opsb 23.06.2010 11:46

Я думаю, вы имеете в виду, что беглый не жидкий.

Montdidier 07.04.2015 11:46

@opsb Я думаю, что технически это моногосударство, а не синглтон.

Montdidier 07.04.2015 11:50

Как начать работу с Avaje Ebean ORM? Любые видеоуроки ??

Avinash 26.12.2017 13:27

Спящий режим, потому что это:

  • стабильна - существует столько лет, что у нее нет серьезных проблем
  • диктует стандарты в области ORM
  • реализует стандарт (JPA), помимо того, что диктует его.
  • есть масса информации об этом в Интернете. Есть много руководств, решений общих проблем и т. д.
  • мощно - вы можете преобразовать очень сложную объектную модель в реляционную модель.
  • он поддерживает любые основные и средние СУБД
  • легко работать, как только ты выучишь это хорошо

Несколько моментов о том, почему (и когда) использовать ORM:

  • вы работаете с объектами в вашей системе (если ваша система хорошо спроектирована). Даже если вы используете JDBC, вы в конечном итоге создадите некоторый слой перевода, так что вы перенесете свои данные в свои объекты. Но я уверен, что спящий режим лучше переводит, чем любое другое решение.
  • это не лишает вас контроля. Вы можете управлять вещами в очень мелких деталях, и если в API нет какой-либо удаленной функции - выполните собственный запрос, и он у вас есть.
  • любая система среднего или большего размера не может позволить себе иметь одну тонну запросов (будь то в одном месте или разбросанных по всему миру), если она нацелена на поддержку
  • если производительность не критична. Hibernate добавляет накладные расходы на производительность, которые в некоторых случаях нельзя игнорировать.

Когда я сравниваю Hibernate и JPA, я выбираю Hibernate, а если сравниваю JPA и JDO, я выбираю JDO! Мне очень нравится JDO, но мне нравятся две функции Hibernate (которые недоступны в JDO): одна - это @Filters, а другая - вы можете отображать поля версии (для оптимистической блокировки) в обычные поля, что невозможно в JDO. .

Amir Pashazadeh 25.02.2012 02:13

Я бы рекомендовал использовать MyBatis. Это тонкий слой поверх JDBC, очень легко сопоставить объекты с таблицами и при этом использовать простой SQL, все под вашим контролем.

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

darpet 24.08.2010 17:47

Многие ORM великолепны, вам нужно знать, почему вы хотите добавить абстракцию поверх JDBC. Я могу порекомендовать вам http://www.jooq.org (отказ от ответственности: я создатель jOOQ, поэтому этот ответ необъективен). jOOQ придерживается следующей парадигмы:

  • SQL - это хорошо. Многие вещи можно довольно красиво выразить в SQL. Нет необходимости в полной абстракции SQL.
  • Реляционная модель данных - это хорошо. Это лучшая модель данных за последние 40 лет. Нет необходимости в базах данных XML или действительно объектно-ориентированных моделях данных. Вместо этого ваша компания использует несколько экземпляров Oracle, MySQL, MSSQL, DB2 или любых других СУБД.
  • SQL имеет структуру и синтаксис. Его не следует выражать с помощью конкатенации строк «низкого уровня» в JDBC или «конкатенации строк высокого уровня в HQL» - оба из которых склонны содержать синтаксические ошибки.
  • Привязка переменных может быть очень сложной при работе с основными запросами. ЭТО нужно абстрагироваться.
  • POJO отлично подходят для написания кода Java, управляющего данными базы данных.
  • POJO сложно писать и поддерживать вручную. Генерация кода - это лучший способ. У вас будут безопасные для компиляции запросы, включая безопасность типов данных.
  • База данных на первом месте. Хотя приложение поверх вашей базы данных может со временем измениться, сама база данных, вероятно, прослужит дольше.
  • Да, у вас есть хранимые процедуры и пользовательские типы (UDT) в вашей устаревшей базе данных. Ваш инструмент базы данных должен это поддерживать.

Есть много других хороших 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?

Vlad Mihalcea 07.07.2016 16:06

Я стараюсь не позволять «База данных на первом месте». Приложение содержит бизнес-правила для функций, которые запрашивает клиент, и они почти никогда не запрашивают создание базы данных. Это техническая деталь, определяемая во время реализации.

Kwebble 04.09.2016 00:49

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

Истинный OOD управляется классами и отношениями, а ORM дает вам согласованное сопоставление различных типов отношений и объектов. Если вы используете инструмент ORM и в конечном итоге кодируете выражения запроса на любом языке запросов, поддерживаемом инфраструктурой ORM (включая, помимо прочего, деревья выражений Java, методы запросов, OQL и т. д.), Вы определенно делаете что-то неправильно, то есть ваша модель класса скорее всего, не поддерживает ваши требования так, как должно. Чистый дизайн приложения на самом деле не требует запросов на уровне приложения. Я проводил рефакторинг многих проектов, которые люди начинали с использования ORM-фреймворка, точно так же, как они использовались для встраивания строковых констант SQL в свой код, и в конце концов все были удивлены тем, насколько простым и удобным в обслуживании становится все приложение, когда вы подходите. улучшите модель вашего класса с помощью модели использования. Конечно, для таких вещей, как функции поиска и т. д. Вам нужен язык запросов, но даже в этом случае запросы настолько ограничены, что создание даже сложного VIEW и сопоставление его с постоянным классом только для чтения намного удобнее поддерживать и смотреть, чем создавать выражения на каком-то языке запросов в коде вашего приложения. Подход VIEW также использует возможности базы данных и, благодаря материализации, может быть намного лучше с точки зрения производительности, чем любой написанный вручную SQL в вашем исходном коде Java. Итак, я не вижу причин, по которым нетривиальное приложение НЕ использует ORM.

Если вы создаете приложения на основе постоянного хранилища, как это делают многие из нас, будь то СУБД или какой-то вариант NoSQL, у этого хранилища будет собственный эффективный способ доступа к нему. Пытаться абстрагироваться от этого слишком многого - это просто чрезмерная инженерия. Чрезмерное рвение к «истинному ООД» приводит к тем архитектурам астронавтов, которыми печально известна Java.

Eelco 07.05.2011 00:57

Другие вопросы по теме