Hibernate - выбор нескольких объединений с коллекциями - PullRequest
4 голосов
/ 01 июня 2009

У меня возникают проблемы с выбором спящего режима для возврата правильно заполненного графа объектов, когда этот выбор содержит объединения из множества коллекций.

Например:

    String sql = "select distinct changeset " +
            "from Changeset changeset " +
            "join fetch changeset.changeEntries as changeEntry " +
            "join fetch changeEntry.repositoryEntity as repositoryEntity " +
            "join fetch repositoryEntity.repository as repository " +
            "where repository.connectionName = :connectionName";
  • Changeset имеет много ChangeEntries
  • ChangeEntry имеет один RepositoryEntity
  • RepositoryEntity имеет один репозиторий

Приведенный выше оператор возвращает правильные данные, но граф объектов заполнен неправильно, т. Е. Каждый набор изменений содержит каждый ChangeEntry, а не только его собственные дочерние элементы.

Вот соответствующие фрагменты этих двух классов:

public class Changeset {

    @NotNull
    @OneToMany(mappedBy="changeset", targetEntity=ChangeEntry.class, cascade={CascadeType.ALL }, fetch=FetchType.EAGER )
    private Set<IChangeEntry> changeEntries;

И ...

public class ChangeEntry {

    @NotNull
    @ManyToOne(targetEntity=Changeset.class)
    @ForeignKey(name="FkChangeEntryChangeset")
    private IScmChangeset changeset;

    @NotNull
    @ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    @ForeignKey(name="FkChangeEntryRepoEntity")
    private IRepositoryEntity repositoryEntity;

Любая помощь очень ценится

Привет

Marty

Ответы [ 2 ]

1 голос
/ 02 июня 2009

Marty:

У меня была такая же проблема, и я не мог найти подходящее решение. Вы можете использовать простые преобразователи результата для контроля количества возвращаемых объектов:

CriteriaSpecification.ROOT_ENTITY
CriteriaSpecification.DISTINCT_ROOT_ENTITY

Но объекты всегда будут содержать полные результаты для своих детей. Я случайно натолкнулся на отличную статью, в которой используется шаблон DTO, проекции и преобразователь aliasToBean.

Вот оно: http://swik.net/Hibernate/Hibernate+GroupBlog/Hibernate+3.2:+Transformers+for+HQL+and+SQL/cmxs

Это хорошо сработало для меня. Самая большая проблема заключается в том, что вы должны создать эти расплющенные объекты DTO. Для меня это не такая уж большая проблема, потому что мои специализированные DTO-объекты используются в результатах поиска и пригодны для многократного использования, плюс мне не понадобится очень много из них.

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

0 голосов
/ 02 июня 2009

Правильно ли работает загрузка одного объекта по его идентификатору? Если нет - читайте дальше. : -)

Я не уверен, достаточно ли использовать @ForeignKey. Попробуйте добавить @JoinColumn ко многим сторонам ваших отношений. Э.Г.

@NotNull
@ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@ForeignKey(name="FkChangeSet")
@JoinColumn(name = "CHANGESET_ID", referencedColumnName = "ID")
private Changeset changeset;

Примечание: я только что увидел, что вы отображаете информацию о сопоставлении для Repository, но я предполагаю, что та, что для Changeset выглядит аналогично.

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