遍历ORM关系会返回重复的结果

NKi*_*253 4 java sql hibernate jpa

我有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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Sve*_*ana 5

这是因为你的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;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此文章