2011-12-20 2 views
1

나는 다른 엔티티로부터 3 개의 엔티티를 상속 받았다. 내가 일예 Single_Table 전략하이버 네이트는 단일 상속을 위해 FetchType을 무시한다.

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 

을 사용하고 클래스 B, C 및 D가 A에서 상속

엔티티 B에서 다른 엔티티 X를 열심히로드하고 있습니다. 불행하게도, Hibernate는 내 주석을 무시하고 엔티티 X.를 가져 오기 위해 각 엔티티 B에 대한 선택을 만듭니다

@ManyToOne(fetch=FetchType.EAGER) 
private Projekt projekt; 

다음과 같이 내 선택 문이 보인다, • A '

좀 더 코드 예제에서 'select A를 :

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "DType", discriminatorType = DiscriminatorType.STRING, length = 3) 
public abstract class A {} 


@Entity 
@DiscriminatorValue(B.PREFIX) 
public class B extends A { 

    @ManyToOne(fetch=FetchType.EAGER) 
    private Projekt projekt; 
} 

이제 Hibernate가 A에서 상속 한 모든 클래스를 쿼리 할 것으로 기대합니다. 불행히도 각 결과 행에 대해 select 문을 실행하여 "projekt"를 쿼리합니다.이 프로 시저는 피하고 싶습니다.

+0

당신의 선택 문이 : join 당신이, 내가이 관계되지 않은 다른 서브 클래스에 존재 않는다는 사실에도 불구하고 InheritanceType.SINGLE_TABLE 문제를 만들지 않습니다 추측 명시 적으로 left join fetch을 지정할 필요가 삽입하기 위해

유효하지 않은 JPQL. "Select a from a a"가 아닐까요? 만약 Hibernate가 각각의 B에 대해 X를 가져 오기 위해 select를 생성한다면, 당신의 주석을 무시하지 않는다 : X는 열심히 가져온다. –

+0

고마워, 나는 예제를 바꿨다. 나는 그것을 가능한 한 쉽게 만들려고 노력했다. – Daniel

답변

1

Hibernate는 FetchType.EAGER에 대해 HQL/JPQL에서 생성 된 SQL 쿼리에 조인을 삽입하지 않습니다.

from A a left join fetch a.projekt 
0

무엇을하고 싶습니까? "from A"를 수행하면 상속 된 모든 유형의 엔티티를 가져옵니다. B, C, D를 가져 오는 SQL 쿼리를 만든 다음 B가 열심히 X를 가져 오는 것은 불가능합니다 (또는 쉽지 않습니다). 무엇을하고 싶습니까?

많은 쿼리가 발생하지 않도록하려면 연결에서 BatchSize를 설정할 수 있습니다. 각 B에 대해 하나의 쿼리 대신 X의로드를 최적화합니다.

B 엔티티에만 관심이있는 경우 "B에서"쿼리를 작성할 수 있습니다.이 경우 연관을 열심히 가져옵니다.

+0

질문이 업데이트되었습니다. 모든 항목을 가져 오려고합니다. 이것은 올바르게 작동합니다. 그러나 Type B의 각 행에 대해 멤버 projekt를 쿼리하는 다른 select 문을 사용하지 않으려합니다. 모든 주석을 사용하려고했지만 무시됩니다. – Daniel

관련 문제