Создана перекрестная выборка по двунаправленному запросу JPA / Hibernate один-ко-многим - PullRequest
0 голосов
/ 24 февраля 2012

Вот основное отображение:

Client {
    @OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private Set<Group> groups = new HashSet<Group>();
}

Group {
    @ManyToOne (cascade=CascadeType.ALL)
    private Client client = new Client();
}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запрашиваю у клиента, я получаю полный клиент для каждой связанной группы. Мои запросы довольно просты, и я пробовал оба критерия и HQL. Вот пример запроса критерия:

    Criteria crit = getSession().createCriteria(getPersistentClass());

    crit.add(Restrictions.like("name", name);
    crit.add(Restrictions.eq("state", state);

    return crit.list();

Какого черта я делаю не так?

Ответы [ 2 ]

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

Измените отображение Client, как показано ниже,

Client {
    @OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private Set<Group> groups = new HashSet<Group>();
}

Из документов API,

You have the ability to either eagerly or lazily fetch associated entities. The fetch parameter can be set to FetchType.LAZY or FetchType.EAGER. EAGER will try to use an outer join select to retrieve the associated object, while LAZY will only trigger a select when the associated object is accessed for the first time. @OneToMany and @ManyToMany associations are defaulted to LAZY and @OneToOne and @ManyToOne are defaulted to EAGER.

Прочитайте документы API здесь для более подробной информации.

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

Это из-за типа загрузки.Hibernate помещает группы в один и тот же запрос, используя соединения.Это умножает клиентов.

Выборка сборок из сборок обычно не очень хорошая идея.У него есть несколько побочных эффектов.Вы только что нашли.

  • Если вы хотите избежать отложенной загрузки, просто выключите отложенную загрузку (я думаю, что это аннотация @LazyCollection(FALSE))
  • Если вас не волнуетпобочные эффекты: умноженные клиенты, которые вы получили по запросу, остаются в памяти теми же экземплярами.Вы можете сократить их до списка отдельных экземпляров.
  • HQL фактически не учитывает эту опцию.Вам нужно join fetch явно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...