2010-06-09 2 views
0

(적절한 타이틀을 제조하는데 매우 무기력 펠트 ...)는 [N] 하이버 네이트 : 연관된 클래스

보기 형상 페칭 특성이 약간 특성이 이러한 클래스에 대한 매핑을 정의하는 것이 가능 조인 쿼리를 사용하여 다른 테이블에서 가져온 것인가? 내 C# 응용 프로그램에서

나는 B의 관련 "C"객체의 관련 "B"개체 및 속성의 일부 속성과 함께, "A"오브젝트의 목록을 표시 :

A.Name B.Name B.SomeValue C.Name 
Foo  Bar  123   HelloWorld 
Bar  Hello  432   World 
... 

가 명확히하기 위해 : A는 FK부터 B까지, B는 C부터 FK까지 (예 : BankAccount -> Person -> Company).

은 내가 [N] 문제를

select A.Name, B.Name as BName, B.SomeValue as BSomeValue, C.Name as CName 
from A 
join B on A.B_ID = B.ID 
join C on B.C_ID = C.ID 

같은 쿼리를 최대 절전 모드 이러한 쿼리의 모든 결과를 매핑 할 수 있습니다, 속성으로 "BNAME", "BSomeValue"와 "CNAME을"클래스 A를 확장하는 경우 A의 속성에?


배경 : 빠른 접근과 깨끗한 접근 방식 : 나는 (NHibernate에 사용) 데이터베이스에서 이러한 속성을로드하는 두 가지 방법을 시도

. 내 궁극적 인 질문 어떻게 빠른 & 깨끗한 접근을 수행하는 것입니다.

빠른 방법 :

  • 는 A, B, C를 결합하고 모든 필드를 제공하는 데이터베이스 뷰를 정의합니다. 는 A 클래스에서
  • , 속성을 정의 "BNAME", "BSomeValue", "CNAME"
  • 필요한 B와 C의 속성 update="false" insert="false"와 매핑되는 반면, A와보기 사이에 최대 절전 모드 매핑을 정의하고 실제로 유래 않는다 B와 C 테이블을 가지고 있지만, Hibernate는 뷰를 사용하기 때문에 그것을 인식하지 못한다.

이렇게하면 목록에는 "A"레코드 당 하나의 개체 만로드되며 이는 매우 빠릅니다. 코드가 실제 연결된 속성 "A.B"에 액세스하려고하면 B를 얻기 위해 다른 HQL 쿼리를 실행하고 속성을 설정하고 가짜 BName 및 BSomeValue 속성도 업데이트합니다.

청소 방법은 :

  • 더보기가 없습니다.
  • 클래스 A가 테이블 A에 매핑되는, B는 C를
  • 에, C를 B로
  • (A)의 목록을로드 할 때, 나는 이렇게 이중 왼쪽 가입 페치뿐만 아니라 B와 C 얻을 : from A a left join fetch a.B left join fetch a.B.C
  • B.Name, B.SomeValue 및 C.Name은 열심히로드 된 연결을 통해 액세스됩니다.

이 접근법의 단점은 "A"레코드 당 3 개의 개체를 만들고 매핑해야하기 때문에 느려지고 더 많은 메모리가 필요하다는 것입니다. 각각 A, B 및 C 개체입니다.

빠른 속도와 깨끗한 방법 :

나는 조인과 테이블 인 것처럼 NHibernate에에 그 치료를 숨 깁니다 데이터베이스보기를 사용하여 어떻게 든 불편. 그래서 다음과 같이하고 싶습니다.

  • 데이터베이스에 뷰가 없습니다.
  • 클래스 "A"의 속성 "BName", "BSomeValue", "CName"을 (를) 선언하십시오.
  • NHibernate가 데이터베이스 뷰처럼 join SQL 쿼리를 사용하여 A와 이들 속성을 함께 가져 오도록 A에 대한 매핑을 정의하십시오.
  • 매핑은 여전히 ​​A.B.C

내 질문에 얻기를 위해 게으른 대일 연결을 정의 할 수 있도록해야합니다

  • 이 가능합니까?
  • 그것은 교묘 한가?
  • 더 좋은 방법이 있습니까?

답변

1

귀하의 "깨끗한"접근 방식은 (다른 사람이 시도 가치도없는)

join fetch 길을 가기 전에, 당신이없이 를 어떻게 볼해야 어떻게해야 가장 가까운 것입니다. 사용법에 따라 충분하다는 것을 알 수 있습니다.

batch-sizecaching에 대한 정보를 원할 수도 있습니다.

그리고 무엇보다 실제 문제를 발견하기 전에 미세 최적화를 시도해서는 안됩니다. "이 방법의 단점은 속도가 느려지고 더 많은 메모리를 필요로한다는 것입니다.", 나는 실제로 그것을 측정했다고 생각하지 않습니다.

+0

안녕하세요. 나는 스톱워치를 사용했다. 그러나 상대적으로 작은 데이터 세트에만 해당됩니다. 빠른 접근 방식은 0.53 초를 사용하는 반면 깨끗한 방식은 1.56 초 (조인 가져 오기 사용)를 수행했습니다. join fetch가 없다면 물론 더 많은 것을 취할 것입니다. – chiccodoro

+0

얼마나 많은 * 1000 * 개의 레코드가 반환됩니까 ???? –

+0

약 1000 개의 레코드입니다. – chiccodoro

관련 문제