2009-05-21 1 views
0

나는 하나의 테이블 (t_Part)의 정보를 가져 오는 간단한 모델 클래스 (Part)를 가지고있다.NHibernate - 잘못된 생각? Join을 기반으로 한 서브 클래 싱 된 모델

(ProducedPart)이 모델의 하위 클래스는 여전히 Hibernate의 캐싱 메커니즘을 사용하지만 "t_PartProduction"이라는 테이블에 외래 키 관계가있는 (Part) 인스턴스 일뿐입니다. 나는이 두 번째 테이블에 대한 모델을 가지고 필요하지 않습니다.

는 난 단지

난 항상이를 통해 외관/저장소를 구현할 수 있지만, 내가 설정 "t_Part"을 가져올 것이라고 매핑을 기대하고 있었는데이 때 "PartProduction"와 결합

ProducedPart의 읽기 전용 버전이 필요 I NH에서 "ProducedPart"를 요청했습니다.

NH를 사용하는 잘못된 방법입니까?

편집 그래서, SQL은

SELECT p.* 
FROM t_Part p 
INNER JOIN t_PartProduction pp ON pp.PartID = p.PartID 
WHERE pp.ProductionYear = '2009' 
+0

, 나는 VIEW를 생성하고 그에 대해 매핑 유창함-자 NHibernate를 사용 :

은 유창함 자 NHibernate를 사용하여,이처럼 보인다. –

답변

1

여기서 핵심은 NHibernate 매핑에 대해 class 정의의 wheremutable 요소를 모두 사용하는 것입니다.이 문제에 대한 궁극적

public Part() 
    { 
     WithTable("t_Part"); 

     Id(i => i.Id).ColumnName("PartID"); 
     Map(m => m.Name).ColumnName("Part"); 

     SetAttribute("where", "PartID IN (SELECT pp.PartID FROM t_PartProduction pp WHERE pp.ProductionYear = '2009') "); 

     ReadOnly(); 
    } 
1

아니,이 완벽하게 가능처럼 보일 것입니다. 상속의 "서브 클래스 당 테이블"모델에 대해서는 NHibernate 문서를 보라. 이것은 실제로 이것을 LEFT JOIN으로 구현하여 Part를로드 할 때 다른 행이 존재하는지 여부에 따라 Part 또는 ProducedPart 클래스의 인스턴스를 생성합니다. nhibernate.info에 관한 문서를 찾을 수 있습니다.

ProducedPart를 읽기 전용으로 만들 수 있는지 확실하지 않습니다.

나는이에서 가정 해요 :

다른 년 t_PartProduction의 레코드가있을 때, 당신이 원하는 경우 즉,이 부분은 처리, 생산 년 2009 만 서브 클래스를 원하는
WHERE pp.ProductionYear = '2009' 

ProducedPart가 아닌 평범한 Part 오브젝트 인 경우, 데이터베이스 내에서 t_PartProduction의 필터링 된 버전 인 뷰 정의를 작성한 다음 기본 테이블이 아닌이 뷰에 서브 클래스를 결합하는 것을 고려할 수 있습니다.

+0

NHForge 링크를 제공해 주셔서 감사합니다. 클래스 요소의 "WHERE"절은 어떻습니까? –

1

당신이 찾고있는 것이 조인 된 하위 클래스라고 믿습니다.

, 당신이 필요로 NHibernate에이 결과를 캐시 한 위해
public class PartMap : ClassMap<Part> 
{ 
    public PartMap() 
    { 
     Id(x => x.Id) 

     JoinedSubClass<ProducedPart>("PartID", sub => { 
      sub.Map(x => x.Name); 
      sub.Map(x => x.ProductionYear); 
     }); 
    } 
} 

는 서브 클래스가 매핑 한하는 (그리고 당신이 그것을 매핑하지 않은 경우, 당신이 얻을 수 없을 것입니다 : FNH, 그것은 같이 보일 것입니다 NH가 첫 번째 장소에로드합니다).

일부 컨텍스트에서 FNH groups thread을 가져 오면 명시 적으로 읽기 전용이 아닙니다. 제 생각에는 NHibernate가 읽기 전용으로 만드는 것은 적절한 것이 아닙니다. 데이터베이스와 연결 (즉, 액세스중인 테이블/뷰에 대한 SELECT 권한 만있는 데이터베이스에 대한 연결 만들기)에 의해 더 잘 제어됩니다. my answer 이전 문제에 대한 내 생각을 NHibernate에서 readonly 세션에 대한 질문을 참조하십시오.

+0

FNH에 모델을 읽기 전용으로 만들기위한 ReadOnly() 메서드가 없습니까? –

+0

예, 발견 한대로 mutable 속성을 false로 설정합니다. 응용 프로그램이 데이터베이스에 닿는 유일한 응용 프로그램이거나 데이터를 읽기 전용으로 유지할 강력한 * 필요성이없는 경우에는이 방법이 유용 할 수 있습니다. 그러나 데이터베이스에 완전히 권한이 부여 된 연결을 사용하는 한 모든 코드는 해당 연결을 사용하여 NH의 속도 범프를 탐색하고 원하는 CRUD 문을 실행할 수 있습니다. 이것이 내가 다른 대답에서 얻은 것입니다. API 사용을 통해 읽기 전용을 제안하는 것이 좋지만 (좋은 설계, 심지어 그렇다), 필요하다면 적절한 수준에서 적용해야한다. –

+0

ProducedPart는 읽기 전용이므로 실제로는 데이터를 살펴 보는 구성입니다. 그것은 본질적으로 현재 프로젝트를위한 매우 유용한 관용구 인 올해의 Production을 갖는 Parts의 SQL'view '를 생성합니다. 이 모델은 기본적으로 가상이기 때문에, 나는 그것을 확실하게하고 불변으로 만들고 싶었다. 감사! –