Как получить объекты из базы данных MySQL с отношением «многие ко многим»? - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть 2 таблицы: Документ и Категория со многими отношениями. Кроме того, отношение имеет атрибут с именем weight . У меня также есть соответствующие Классы с Документом , представленным следующим образом:

public class Document {
    private Integer id; // Id from DB, 0 if new object
    private String name;
    private String url;
    private Date dateCreated;
    private List<Category> categories;

    // getters & setters...
    }

Теперь у меня есть 2 вопроса, особенно это касается лучших практик. Я хочу получить данные из базы данных (MySQL) и создать свои объекты. Я использую оператор SELECT следующим образом:

SELECT doc.*, GROUP_CONCAT(cat.CategoryID SEPARATOR ',') AS CategoryGrp FROM document doc
LEFT JOIN doc_category dc ON doc.Doc_ID = dc.DC_DocID
LEFT JOIN category cat ON dc.DC_CategoryID = cat.CategoryID
GROUP BY doc.Doc_ID

В наборе результатов rs.getString (5) -> CategoryGrp будет иметь идентификаторы связанных категорий. Теперь, как мне приступить к созданию моего объекта Document, связав его Категории, как того требует Класс.

Я, как правило, делаю новый SELECT запрос к таблице Категория , чтобы получить другие данные (например, имя категории) в цикле, пока он еще находится на первом ResultSet. Это хорошая практика? Разве нет «рекомендуемого» способа?

Мой второй вопрос касается атрибута weight в соединительной таблице. В каком объекте я должен записать его значение? Я предполагаю, что это категория, но не совсем уверен, поскольку объект категории не может иметь вес сам по себе ...

Надеюсь, я достаточно ясно. Спасибо

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Соотношение «многие ко многим» в СУБД ВСЕГДА выполняется по крайней мере 3 таблицами.Итак, вам нужна третья таблица, которая будет содержать идентификаторы из первых двух, все ваши SELECT будут проходить через эту третью таблицу.

0 голосов
/ 24 февраля 2012

Ответ на 1-й вопрос: 2 способа: один sql или как вы предлагаете 2 sql.(получите документы и для каждого идентификатора кота выполните sql для получения атрибутов кота) Я думаю, что это лучше: получите все свои документы с разными котами и их атрибутами.Зациклите его и сравните документ с предыдущим.Если отличается, то у вас есть новый объект документа.Каждая строка в цикле - это отдельный объект cat.

doc1 cat1
doc1 cat2
doc1 cat3
doc2 cat4
doc3 cat5
doc3 cat6
... 

Ответ на второй вопрос: я думаю, вы должны рассмотреть это: вес больше связан с doc или cat?С другой стороны, вы не можете иметь несколько весов на 1 документе, поэтому я предполагаю добавить к коту (так как это отношение 1 на 1.

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