Отображение карты <String, List <Foo >> в Hibernate

1

Учитывая следующий объект:

Keyword{
  int id;
  String area;
  String keyword;
  Article article;
}

Каков наилучший способ сопоставить следующую ассоциацию в Hibernate, где ключ карты должен быть Keyword.area:

Article{
  private Map<String,List<Keyword>> keywords = new HashMap<String, List<Keyword>>();
}

Это просто, если это была карта, но в этой ситуации мне больше всего нужно будет получить доступ к ключевым словам по областям (например, article.findAll("наука"), чтобы вернуть все ключевые слова в науке).

Лучшей идеей, которую я получил до сих пор, является преобразование первого в

private Map<String,KeywordGroup> keywords = new HashMap<String, KeywordGroup>();

но это оставляет мне некоторые вопросы, например:

  • Свойства в KeywordGroup? Логически он будет состоять из "области" и "списка", но как отобразить это?
  • Простейший дизайн базы данных для этого состоит в том, чтобы иметь столбец FK в ключевом ключе для article_id, не будет ли KeywordGroup усложнять это?

Какой подход вы бы предложили?

Теги:
hibernate
hibernate-mapping

1 ответ

0
Лучший ответ

Я думаю, что следующая реализация статьи будет работать для вас, без необходимости в Карте.

@Entity
public class Article {

    @OneToMany(mappedBy="article")
    private Set<Keyword> keywords;

    //..

    public Set<Keyword> findKeywordsByArea(String area) {

        Set<Keyword> matchingKeywords = new HashSet<Keyword>();
        for(Keyword keyword : this.keywords) {
            if(keyword.getArea().equals(area)) {
                matchingKeywords.add(keyword);
            }
        }
        return matchingKeywords;
    }
}
  • 0
    Обратите внимание на это, спасибо за предложение - я тоже об этом подумал. Однако не приведет ли это к проблемам с производительностью, а именно к необходимости запрашивать полный набор ключевых слов статьи каждый раз, когда я хочу найти KeywordsByArea? Возможно, я столкнусь с теми же проблемами с производительностью при другом подходе, я просто не хочу сталкиваться с проблемой выбора N + 1 или схожими проблемами.
  • 0
    Я хотел бы что-то работать, прежде чем беспокоиться о производительности Вместо перебора всего набора ключевых слов вы можете написать собственный запрос HQL.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню