2011-01-06 4 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

당신이 같음을 구현하는 경우와 해시 코드 메서드를 올바르게 호출하고 Collection이 아닌 Set에 저장하면 중복 량이 과도하지 않으면 문제가되지 않습니다.

0
  1. getter 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 관계 때문에 또는 당신이 두 가게의 데이터 집합을 쿼리하고 있기 때문에. Depend가 SQL 스키마에 있습니다. JPA는 "블랙 박스"이며 진행중인 작업을 찾는 가장 좋은 방법은 생성 된 SQL을 보는 것입니다. 최대 절전 모드 사용 옵션을 위해 hibernate.show_sql http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional – Osw

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

관련 문제