2012-11-17 4 views
1

나는이 시나리오를 가지고있다 : 부모 클래스 Person, children 클래스 : Individual과 Enterprise. 나는 사람의 목록을로드하기 위해 간단한 HQL을 사용하는 경우Hibernate 4 : HQL과 상속 - 컬렉션과 자바 클래스 가져 오기

<hibernate-mapping> 
    <class catalog="test" name="test.Person" table="Persons"> 
    <id name="id" type="int"> 
     <column name="IdPerson"/> 
     <generator class="increment"/> 
    </id> 

    <set inverse="true" name="addresses"> 
     <key> 
     <column name="IdPerson" not-null="true"/> 
     </key> 
     <one-to-many class="test.Address"/> 
    </set> 

    <set inverse="true" name="phones"> 
     <key> 
     <column name="IdPerson" not-null="true"/> 
     </key> 
     <one-to-many class="test.Phone"/> 
    </set> 

    <joined-subclass name="test.Individual" table="Individuals"> 
     <key column="IdPerson"/> 

     <property name="nameIndividual" type="string"> 
     <column length="30" name="Name" not-null="true"/> 
     </property> 
    ... 
    </joined-subclass> 

    <joined-subclass name="test.Enterprise" table="Enterprises"> 
     <key column="IdPerson"/> 

     <property name="nameEnterprise" type="string"> 
     <column length="30" name="Name" not-null="true"/> 
     </property> 
    ... 
    </joined-subclass> 

    </class> 

    <class catalog="test" name="test.Address" table="Addresses"> 

    <composite-id class="test.AddressId" name="id"> 
     <key-many-to-one name="person" class="test.Person"> 
     <column name="IdPerson" not-null="true"/> 
     </key-many-to-one> 
     <key-property name="id" type="int"> 
     <column name="IdAddress"/> 
     </key-property> 
    </composite-id> 

    <many-to-one name="person" class="test.Person" fetch="select" insert="false" update="false"> 
     <column name="IdPerson" not-null="true"/> 
    </many-to-one> 
    ...  
    </class> 

    <class catalog="test" name="test.Phone" table="Phones"> 

    <composite-id class="test.PhoneId" name="id"> 
     <key-many-to-one name="person" class="test.Person"> 
     <column name="IdPerson" not-null="true"/> 
     </key-many-to-one> 
     <key-property name="id" type="int"> 
     <column name="IdPhone"/> 
     </key-property> 
    </composite-id> 

    <many-to-one name="person" class="test.Person" fetch="select" insert="false" update="false"> 
     <column name="IdPerson" not-null="true"/> 
    </many-to-one> 
    ... 
    </class> 

</hibernate-mapping> 

가 :

List result = session.createQuery("from Person as en").list(); 

최대 절전 모드가 다형성 확인 해결, 나는 얻을 나는이 같은 조인 서브 클래스 전략이 클래스를 매핑하고있어 개인 및 기업 객체 목록

하지만이 주소 및 전화를 포함 할 때 :

List result = session.createQuery("from Person as en left join fetch en.addresses left join fetch en.phones").list(); 

최대 절전 모드는 Indivual 및 엔터프라이즈 클래스의 특정 속성없이 액세스 할 수있는 사람 _ $$ _ javassist_5 개체의 목록을 반환합니다.

이것은 예상되는 동작입니까? 어떻게 해결할 수 있을까요?

미리 감사드립니다.

편집 : 프록시하지 않는 이유는 주소 및 전화 클래스 매핑을 포함했다

는 그 아이디의 복합이며, 최대 절전 모드에 의해 생성 된 와 Javassist 프록시에 대한 이유가 될 것 같다,하지만 다형성을 올바르게 해결 하시겠습니까? 심지어 hibernate가 데이터베이스로부터 모든 데이터를 얻었을 때.

내 JSF 페이지에서 javax.el.PropertyNotFoundException 오류가 발생합니다. 'test.Person _ $$ _ javassist_5'클래스에 'nameIndividual'속성이 없습니다.

답변

0

비슷한 예제, 즉 하나의 클래스는 두 개의 하위 서브 클래스가 합쳐져서 시도되었고, 부모 클래스는 일대 다 연관을 가졌다.

예제와 마찬가지로 fetch를 사용하지 않고 상위 클래스 레코드를 검색 한 다음 "left join fetch"를 검색했습니다.

일대 다 연관을 올바르게 검색하는 데 걸리는 시간.

가져 오기 모드를 사용하면 결과 목록에 중복 레코드가 포함되어 있습니다.

일대 다 연관에서 하나의 레코드는 관련 테이블에 4 개의 레코드를 가지며 결과 목록에는 동일한 개체가 4 번 포함됩니다. 다른 레코드의 경우 관련 레코드가 2 개이면 결과 목록에 동일한 객체가 두 번 포함됩니다.

그러나 이것은 최대 절전 모드 문서에 따라 예상된다 : -. http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

"페치 구조는 iterate()를 사용하여 호출되는 쿼리() (스크롤()를 사용할 수 있지만)에서 사용할 수 없습니다 가져 오기와 함께 사용되어야한다 setMaxResults() 또는 setFirstResult() 이러한 작업은 일반적으로 eager collection fetching을위한 중복을 포함하는 결과 행을 기반으로하므로 행 수는 기대 한 것과 같지 않습니다. 또한 Fetch는 조건이있는 즉석과 함께 사용되어서는 안됩니다 질의에 두 개 이상의 콜렉션을 조인하여 카티 전 곱을 생성 할 수 있으므로이 경우주의를 기울여야합니다. 여러 콜렉션 롤을 가져 오는 것은 bag 매핑에 대한 예상치 못한 결과를 생성 할 수 있으므로 사용자의 재량은 이 경우에 질의를 공식화 할 때 권고한다.마지막으로, 전체 조인 가져 오기 및 오른쪽 조인 가져 오기는 의미가 없습니다. "

+0

감사합니다. 시간과 답변을 주셔서 감사합니다. 죄송합니다. 주소 및 전화 매핑을 생략했습니다. 이러한 클래스에 simples ids가 있으면 최대 절전 모드로 작동합니다. 그들은 실제로 합성물입니다. – vladiastudillo