OR-отображение через таблицы - PullRequest
0 голосов
/ 18 января 2012

Я уверен, что разные инструменты ORM решают проблему по-разному, но, будучи совершенно новым для самой концепции or-mapping, я не особо заинтересован в конкретной реализации, так как я являюсь универсальным решением , Если просто невозможно ответить на этот вопрос без конкретной структуры ORM, давайте перейдем к Hibernate.

Я понимаю основную предпосылку or-mapping, однако мне любопытно, как эти структуры обрабатывают запросы, которые охватывают несколько таблиц, например, что происходит, когда в запросе присутствует JOIN s.

SELECT f.fizz_name, b.buzz_foo
FROM fizz f
INNER JOIN buzz b
ON f.buzz_id = b.buzz_id
WHERE b.buzz_bar < 10

Теперь мы не получаем хороший, чистый, единственный POJO от or-mapper. Я задаюсь вопросом, является ли это областью, в которой ломается or-mapping, и JDBC - это все, с чем должен работать программист.

Я, честно говоря, попробовал один и не смог найти в документах Hibernate ничего, что указывало бы на то, что происходит в такой ситуации.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 18 января 2012

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

В почти во всех случаях, когда это происходит, либо кодовое представление объекта слишком велико и его необходимо разбить на составные части, либо представление объекта в БД фрагментировано, а данные гораздо более коррелированный, чем указывает БД.

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

0 голосов
/ 21 января 2012

Вопрос может в конечном итоге привести к глубоким дискуссиям по поводу несоответствия объектно-реляционного импеданса . Чтобы избежать этого обсуждения, вы должны спросить себя, разрабатываете ли вы приложение OLTP или OLAP .

  • OLTP: ваши сущности JPA в основном отображаются непосредственно на базовые таблицы, и вы можете легко выполнять над ними операции CRUD, считывая, удаляя, сохраняя их. Объединения могут рассматриваться как указанные здесь hvgotcodes как простой инструмент корреляции данных из различных объектов для создания предикатов, но обычно вы не создаете новые специальные типы с пользовательскими проекциями. Тогда Hibernate идеально подходит для вас.

  • OLAP: ваши сущности JPA вряд ли сопоставляются с какими-либо базовыми таблицами, поскольку типы, которые вы хотите создать с помощью пользовательских проекций (SELECT f.fizz_name, b.buzz_foo), могут представлять собой любую произвольную комбинацию столбцов / функций / агрегатов. Это не имеет ничего общего с самим соединением, но с тем фактом, что вы создаете произвольные проекции.

Ваш пример все еще довольно прост, и Hibernate может хорошо с ним справиться, как указано ChssPly76 . Чтобы получить POJO, который вы хотите, вы можете сделать что-то вроде этого (из документов):

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

Но если вы углубитесь в OLAP, вы можете обнаружить, что Hibernate (HQL, JPQL) недостаточно выразителен. Вот где JDBC, jOOQ , mybatis , Spring Templates могут быть лучше подходят.

0 голосов
/ 18 января 2012

Как вы указали, разные инструменты ORM, вероятно, подходят к нему по-разному, но в спящем режиме вы получаете список массивов, где каждый столбец является объектом в Object [].

См.раздел 16.6 здесь для более подробного объяснения.

Ключевым моментом является то, что вам не нужно использовать простой sql для получения результатов из запроса на соединение, по крайней мере, с Hibernate.

...