(적절한 타이틀을 제조하는데 매우 무기력 펠트 ...)는 [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
내 질문에 얻기를 위해 게으른 대일 연결을 정의 할 수 있도록해야합니다
- 이 가능합니까?
- 그것은 교묘 한가?
- 더 좋은 방법이 있습니까?
안녕하세요. 나는 스톱워치를 사용했다. 그러나 상대적으로 작은 데이터 세트에만 해당됩니다. 빠른 접근 방식은 0.53 초를 사용하는 반면 깨끗한 방식은 1.56 초 (조인 가져 오기 사용)를 수행했습니다. join fetch가 없다면 물론 더 많은 것을 취할 것입니다. – chiccodoro
얼마나 많은 * 1000 * 개의 레코드가 반환됩니까 ???? –
약 1000 개의 레코드입니다. – chiccodoro