LINUX.ORG.RU

@ManyToMany связь через Link таблицу

 , ,


1

1

Как осуществить такую связь?

Сущности:
articles (id, title, text)
authors (id, login, password)

article может иметь несколько authors, author может иметь несколько articles. Для того чтобы не использовать @ManyToMany мне порекомендовали сделать такую линк-таблицу:
articlesauthorslink (id, article, author), при этом article это FK articles, author — FK authors. Пример использования:
0 | article0 | author0
1 | article0 | author1
2 | article1 | author0
и т.д.

Как мне выгребать данные из базы? Нужно 3 entity: ArticlesEntity, AuthorsEntity, ArticlesAuthorsLinkEntity? Если кто-то знает как работать с линк-таблицами, опишите в общих чертах, пожалуйста.

★★★★★

Таблица articlesauthorslink является стандартным способом реализации соотношения много ко многим.

join'ами или select'ами можешь выбирать что угодно, в чем собственно проблема?

Genuine ★★★
()
Ответ на: комментарий от Genuine

Как должны выглядеть эти 3 Enity? 3 ли? Есть еще такой момент, что мне нужно избегать аннотации @OneToMany. Я во всем этом запутался, поэтому прошу если не разжевать, то хотя бы дать мне ссылку на годный туториал по связям и использовании такой таблицы.

f1xmAn ★★★★★
() автор топика
Ответ на: Оно? от windofchange

Нет, мне нужно избегать аннотаций @ManyToMany и @OneToMany при помощи этой линк таблицы. Я поначалу хотел отделаться простыми запросами к базе, но нужно использовать маппинг этой таблицы.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Нет, мне нужно избегать аннотаций @ManyToMany

То, что ты описал в заголовке темя и есть отношением много-ко-многим. Стандартной реализацией такого отношения средствами sql является создание третей - связующей таблицы. Например, если между таблицами A и B отношение много-ко-многим, то создается третья таблица A_B, в которой поля id - идентификатор записи, a_id - внешний ключ (соответствует A.id) и b_id - внешний ключ (соответствует B.id).

В твоем случае выбор, например, авторов и соответствующих им книг осуществляется конструкцией вида

SELECT authors.login, articles.title
FROM authors INNER JOIN articlesauthorslink ON authors.id = articlesauthorslink.author INNER JOIN articles ON articles.id = articlesauthorslink.article;

Genuine ★★★
()
Ответ на: комментарий от Genuine

Ага! Вроде бы дошло, когда за дело возьмусь — станет ясно, дошло или нет. ☺

Спасибо.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Человек, который их порекомендовал (читай приказал) избегать сетует на скорость получения данных из базы.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Потому что по дефолту там lazy, что кстати то что надо, когда выгребаешь только первый обьект. А потом тебе внезапно нужны остальные и ты делаешь еще запросы.

Некоторые двоечники стремглав делают eager и получают большие датасеты когда им не надо. А по нормальному нужно использовать на уровне JPQL запрос типа FETCH JOIN в тех случаях когда точно нужно потом будет получить связанный обьект, он сразу выберет все вместе. Но опять же, только когда это именно то что нужно

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от vertexua

Кинь в меня туториалом, в котором нормально объясняется про все эти *-To-* отношения в реляционных БД. Пожалуйста. Я в этом очень хреново плаваю, но очень хочется это исправить.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Спасибо. Но до меня пока не дошло как совет Genuine использовать вместе с entity, которая будет маппингом articlesauthorslink? Т.е. как должны выглядеть ArticlesAuthorsLinkEntity, ArticlesEntity и AuthorsEntity? С последними двумя все ясно кроме того, как туда вписать ArticlesAuthorsLinkEntity, а точнее, наверное, коллекцию ArticlesAuthorsLinkEntity.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

ArticlesAuthorsLinkEntity не должно быть вообще. Почитайте о @ManyToMany. Вкратце, у Article есть поле authors со списком из других сущностей с кучей аннотаций включая ManyToMany, которые все конфигурируют. У Author поле с обратным списком связей articles с аннотацией ManyToMany с атрибутом mappedBy=«authors», которое указывает на названия поля с конфигураций.

Тоесть как бы конфигурация только в одной сущности, а в другой сущности просто ссылка на конфигурацию.

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Ох, ладно. /me ушел читать твой викиталмуд.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Тебе на чистом JDBC надо реализовать?

Опять таки JavaEE6 Tutorial поможет тебе.

Если не понимаешь - почитай книжку Грабера по SQL - вроде достаточно хорошо разжевано.

TheKnight ★★★
()
Ответ на: комментарий от TheKnight

Да, стратегию lazy/eager, это позволяет связать вообще все сущности в lazy bidirectional отношения. Если бы они были не lazy, то почти любой запрос загружал бы всю базу в память (при условии что оно вообще бы осилило нагенерить такой чудо-запрос). lazy - хороший default, который позволяет прозрачную навигацию по дереву обьектов в рамках транзакции. А join fetch позволяет конфигурировать выборку набора разнотипных связанных сущностей в одном запросе с целью оптимизации производительности. Но после join fetch запроса интерфейс работы с данными не меняется, просто при использовании списков связанных сущностей они уже там есть.

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.