2011-01-06 59 views
4

我有4個表格 - store, catalog_galleries, catalog_images, and catalog_financials遍歷ORM關係返回重複結果

當我遍歷從store --> catalog_galleries --> catalog_images換句話說:store.getCatalogGallery().getCatalogImages()我得到重複的記錄。有誰知道這可能是什麼原因?任何建議在哪裏看?

store表具有與catalog_galleries一個OneToOne關係,其又具有與catalog_images一個OneToMany關係以及預先抓取類型。 store表還與catalog_financialsOneToMany關係。

下面是相關實體:

實體店

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

} 
+0

沒有足夠的信息,請提供您的JPA類與映射。你有沒有試過看看生成的SQL? – Osw 2011-01-06 23:34:22

+0

所有記錄是否重複?你有沒有檢查你的連接列重複條目? – weltraumpirat 2011-01-07 00:54:59

回答

0

如果要實現平等和哈希碼方法正確並存儲在一個集合而不是一個集合,這是一個問題,除非重複的數量是過度的。

0
  1. 您的獲得者catalogImages()不遵循Java Bean命名約定。我不確定,但它可能會以某種方式混淆JPA供應商。
  2. 通過使用Collection<CatalogImage>您明確告訴JPA提供商重複項允許。正如已經告訴的那樣,在大多數情況下使用Set而不是Collection解決重複問題,並且允許避免FetchType.EAGER,除非您真的需要它。
5

這是因爲您的fetch = FetchType.EAGER
Hibernate創建JOIN並嘗試使用一個查詢獲取所有集合。
如果你真的需要FetchType.EAGER,不想更換您的收藏與設置您可以使用@Fetch (FetchMode.SELECT)註釋爲您的收藏:

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

欲瞭解更多信息,請參閱本post