Обход отношений ORM возвращает дублированные результаты - PullRequest
4 голосов
/ 07 января 2011

У меня 4 таблицы - store, catalog_galleries, catalog_images, and catalog_financials.

Когда я пересекаю связь с store --> catalog_galleries --> catalog_images, другими словами: store.getCatalogGallery().getCatalogImages() Я получаю дубликаты записей. Кто-нибудь знает, что может быть причиной этого? Любые предложения о том, где искать?

Таблица store имеет отношение OneToOne с catalog_galleries, которое, в свою очередь, имеет отношение OneToMany с catalog_images и тип нетерпеливого извлечения. Таблица store также имеет отношение OneToMany с catalog_financials.

Ниже приведены соответствующие лица:

Магазин лица

@Entity
@Table(name="store")  
public class Store {
    ...
    private CatalogGallery gallery;
    ...
    @OneToOne(mappedBy="store")
    public CatalogGallery getGallery() {
        return gallery;
    }
}

CatalogGallery объекта

@Entity
@Table(name="catalog_galleries")  
public class CatalogGallery {
    ...
    private Store store;
    private Collection<CatalogImage> catalogImages;
    ...
    @OneToOne
    @PrimaryKeyJoinColumn
    public Store getStore() {
        return store;
    }

    @OneToMany(mappedBy="catalogGallery", fetch=FetchType.EAGER)
    public Collection<CatalogImage> getCatalogImages {
        return catalogImages;
    }
}

CatalogImage объекта

@Entity
@Table(name="catalog_images")  
public class CatalogImage {
    ...
    private CatalogGallery catalogGallery;
    ...
    @ManyToOne
    @JoinColumn(name="gallery_id", insertable=false, updatable=false)
    public CatalogGallery getCatalogGallery() {
        return catalogGallery;
    }

}

Ответы [ 3 ]

5 голосов
/ 09 ноября 2011

Это из-за твоего fetch = FetchType.EAGER.Hibernate создает JOIN и пытается получить все ваши коллекции одним запросом.Если вам действительно нужно FetchType.EAGER и вы не хотите заменять свою коллекцию Set, вы можете использовать аннотацию @Fetch (FetchMode.SELECT) для своей коллекции:

@OneToMany(mappedBy="catalogGallery", fetch=FetchType.EAGER)
@Fetch (FetchMode.SELECT)
public Collection<CatalogImage> getCatalogImages {
    return catalogImages;
}

Для получения дополнительной информации см. сообщение

0 голосов
/ 07 января 2011
  1. Ваш получатель catalogImages() не соответствует соглашению об именах Java Bean.Я не уверен, но это может как-то запутать JPA-провайдера.
  2. Используя Collection<CatalogImage>, вы прямо сказали JPA-провайдеру, что допускается дублирование .Как уже говорилось, использование Set вместо Collection решает проблему дубликатов в большинстве случаев и позволяет избежать FetchType.EAGER, если вам это действительно не нужно.
0 голосов
/ 07 января 2011

Если вы правильно реализуете методы equals и hashcode и сохраняете их в наборе, а не в коллекции, это не проблема , если объем дубликатов не будет чрезмерным.

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