2009-08-06 4 views
1

내가 many-to-one 연관 관계는 hbm.xml 이와 같이 설정이 연관되지 않은 :대일 HQL 질의를 최대 절전 모드,

<many-to-one name="gigVenue" 
class="blah.blah.xxx" fetch="select" 
lazy="no-proxy" not-null="true" > 
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" /> 
</many-to-one> 

내가 사용하고 진정한 게으른 로딩을하기위한 계측.

하지만 다른 테이블의 값인 개체를 포함해야하는 속성은 null로 남겨 둡니다. 최대 절전 모드로 생성되는 다른 테이블의 값의 개체를 볼 수는 있지만.

누구든지이 문제에 대해 통찰력을 갖고 있습니까?

갱신 :

from Gig g inner join fetch g.gigVenue gv where g.artistId = :artistId and (g.territoryId = -1 or g.territoryId = :territoryId) order by g.gigDatetime desc 

<set name="gigs" inverse="true" lazy="true" table="DSP_GIG" fetch="select"> 
<key> 
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" /> 
</key> 
<one-to-many class="blah.blah.Gig" /> 
</set> 
+0

실제 쿼리와 두 번째 매핑을 게시 할 수 있습니까? – ChssPly76

답변

1

당신이 바이트 코드 계측 대신 협회 프록시를 (왜?) 당신이 당신의 쿼리에서 "모든 속성을 가져"지정해야 사용하고 있기 때문에 :

from Gig g fetch all properties ... 

세부 정보 here

업데이트는 다음과 같습니다 귀하의 gigVenue 매핑을 설정하는 것입니다~ no-proxy. 이것이 의미하는 것은 getter 메서드를 통해 처음 액세스 할 때까지 속성이 NULL이된다는 것입니다. 이것은 바이트 코드 계측을 사용하여 수행되며 일반적으로 사용되는 것이 아닙니다. HQL join fetch을 사용하면 이러한 속성을 채울 수 없습니다. 위에서 설명한대로 명시 적으로 fetch all properties을 지정해야합니다.

하면 하나 GigVenue의 's에 액세스하면 초기 선택시 gigVenue 식별자를 포함하는 프록시 개체와 속성을 초기화 할 다음, 실제 개체를 검색 (즉, 실제로 대일이의 기본이다) 대신 lazy="proxy" 설정 고려 행동 양식. HQL에서 join fetch을 사용하면이 경우에도 초기 선택시 인스턴스 GigVenue 전체를 가져올 수 있습니다.

참고로 fetch="select"을 설정하는 것도 의문의 여지가 있습니다. 인출을 위해 외부 조인을 사용하도록 설정하려면 기본값 인 join으로 설정하는 것이 좋습니다.

+0

좋습니다. 우리가 no-proxy를 사용하는 이유는 일대일 (always-to-one)이 항상 그렇지 않으면 항상 가져 오기 때문입니다. 그래서 many-to-one 사용 프록시에서 one-to-one은 진정한 lazy fetching을 사용하는 것이 no-proxy와 instrumentation을 사용하는 것처럼 보입니다. – Gilgad

+0

및 자세한 내용은 http://stackoverflow.com/questions/965059/how-to-lazy-load-a-one-to-one-composition-via-hql을 참조하십시오. – Gilgad

+0

제한되지 않은 일대일은 특별한 경우입니다. 아직이 설명이 없다면 https://www.hibernate.org/162.html을보십시오.솔직히 말해서 일대일 연결의 다른 끝을 선택하는 것이 끔찍한 결과를 가져 오는 경우를 결코 보지 못했지만 바이트 코드 계측은 실제로이 시나리오의 유일한 솔루션입니다. 이러한 것들은 항상 PK 기반입니다. – ChssPly76

0

계측은 쿼리 및 작동 방식에 실제로 영향을 미치지 않습니다. 왜 당신은 쿼리에서 가져 오기를 정확히하고 있습니까? 속도를 높이려고하십니까?

그리고 작은 질문도 있습니다. 어떻게하면 을 알고 값이 null입니까? Java 디버거를 통해 또는 실제로 "get"메서드를 호출하여 그 것입니다? 도구를 사용하면 실제 필드를 요청할 때까지 필드가 일반적으로 null이됩니다.

+0

예 초기 쿼리 후 db에 대한 전체 히트를 중지하려고합니다. 그리고 예. 일단 getter를 호출하면 DB에서 값을 가져올 수 있습니다.하지만 이미 객체를 가져 왔고 (그 유형의 객체를 볼 수 있습니다.) 왜 그 속성에 그냥 밀어 넣지 않습니까? 이미? – Gilgad

+0

계측은 쿼리에 영향을 미치지 않습니다. 자세한 설명으로 내 대답을 업데이트했습니다. – ChssPly76