2011-01-06 14 views
4

私は4つのテーブル - store, catalog_galleries, catalog_images, and catalog_financialsを持っています。ORM関係をトラバースすると重複した結果が返されます

store --> catalog_galleries --> catalog_imagesから関係をトラバースすると、つまり:store.getCatalogGallery().getCatalogImages()私は重複したレコードを取得します。誰もがこれの原因となる可能性があることを知っていますか?見た目の提案はありますか?

storeテーブルは、順番にcatalog_imagesOneToMany関係と熱心なフェッチ・タイプを有するcatalog_galleriesOneToOne関係を有します。 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; 
    } 

} 
+0

ない十分な情報を参照し、提供してください、あなたのマッピングを持つJPAクラス生成されたSQLを見てみましたか? – Osw

+0

すべてのレコードは重複していますか?重複したエントリの結合列をチェックしましたか? – weltraumpirat

+0

はい、すべてのレコードに重複があります。 'catalog_images'には、' join'カラムに同じ値を持ち、関連するデータ/イメージをグループ化する複数のエントリがあります。 – NKing253

答えて

0

とhashcodeメソッドを正しく呼び出してCollectionではなくSetに格納すると、のほうが少なくなります。重複のボリュームが大きすぎる場合を除きます。

0
  1. ゲッターcatalogImages()は、Java Beanの命名規則に従いません。私は確信していませんが、何とかJPAプロバイダを混乱させるかもしれません。
  2. Collection<CatalogImage>を使用すると、が重複が許可されていることを明示的にJPAプロバイダに伝えました。すでに言われたように、Collectionの代わりにSetを使用すると、ほとんどの場合重複問題が解決され、本当に必要な場合を除き、FetchType.EAGERを避けることができます。
+0

getterは 'getCatalogImage'とされています。コードの元の投稿は誤字です。 'Set'への切り替えに関しては、重複を排除することを理解していますが、なぜjpa/hibernateが作成したSQLクエリーから重複が作成されているのか分かりません。 – NKing253

+0

@ NKing253、私のpovから、StoreとCatalogGalleryの間にone2one関係があるため、または2つのストアのデータセットを照会しているためです。あなたのSQLスキーマに依存します。 JPAは "ブラックボックス"であり、何が起こっているのかを見つける最も良い方法は、生成されたSQLを見ることです。 hibernate.show_sqlのhibernate使用オプションの場合http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional – Osw

5

これはあなたのfetch = FetchType.EAGERのためです。
HibernateはJOINを作成し、すべてのコレクションを1つのクエリで取得しようとします。あなたが本当にFetchType.EAGERを必要としたSetで、あなたのコレクションを交換したくない場合は
あなたのコレクションのための@Fetch (FetchMode.SELECT)注釈を使用することができます。

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

の詳細については、このpost

関連する問題