2009-10-26 2 views
2

한 개체의 많은 다른 사람과 관련된 :ORM은 - 협회와 객체를 생성

예 : 하나 Post은 ..... 하나 Blog의 일부인 Tags과의 관계의 목록, 그리고 많은 다른 것들을 가지고

그런 다음 드롭 다운 상자가있는 하나의 웹 양식이 있습니다. 각 개체는 ID 및 해당 개체의 이름 만 검색하기 위해 사용자 지정 쿼리에서 채워지므로 큰 크기 값을 가질 수 있기 때문에 모든 개체가 표시되지 않습니다 (나에게 묻지 마십시오. 왜, 그러나 그것은 일어날 수있다) 그리고 드롭 다운 박스를 만들기 위해 다른 속성들을 필요로하지 않기 때문이다.

지금 내가 이런 일을 할 필요가 새로운 Post을 만들려고 할 때 :

Post post = new Post(); 
post.Blog = blog; 
..... 

내가 객체를 생성하고 블로그의 유일한 ID를 전달하기 위해 SQL 쿼리를 사용할 수 ORM하기 전에, 하지만 지금은 블로그 개체를 전달해야합니다. 이것은 게시물을 작성하기 위해 DB에서 검색해야한다는 것을 의미하며,이 게시물에는 태그 오브젝트 및 기타 사항이 필요합니다. 나는 이것이 불필요한 조작이라고 생각한다. 왜 내가 다른 모든 물건을 만들어 다른 물건을 만들어야합니까?

비슷한 질문이 있습니다. here하지만 대답은 대답이 없습니다.

이전에 설명한 이유 때문에 드롭 다운 상자에서 개체를 캐시하지 않습니다.

postId (blog)으로 전달하고 싶습니다. 이 일을 할 수있는 방법이 있습니까?

.

참고 : NHibernate를 사용하지만 이것은 일반적인 ORM 질문이라고 생각합니다.

답변

1

투사 등급을 사용할 수 있습니다. 필요한 정보 만 검색하고 전체 DB 레코드는 검색하지 않습니다.

한 예 :

HqlBasedQuery query = new HqlBasedQuery(typeof(Post), 
     @" 
     SELECT tags.Id, tags.Name 
     FROM Post post 
     INNER JOIN post.Tags tags 
     WHERE post.Id = ? 
     ORDER BY tags.Name 
     ", postId); 
     var results = from object[] summary in (ArrayList)ActiveRecordMediator.ExecuteQuery(query) 
         select new YourProjectionClass 
         { 
          Id = (int)summary[0], 
          Name= (string)summary[1], 
         }; 
     return results.ToList<YourProjectionClass>(); 
0

ORM에서 원하는대로 수행 할 수 있습니다.
부분적으로 채워진 블로그 만 사용하여 게시물을 만듭니다.

여러 번 사용하는 경우
Post post = new Post(); 
    post.setBlog(new Blog(123)); 

는이 코드를 줄일 수있는 확실한 방법이 있습니다 :

이것은 매우 일반적인 코드입니다. 가 나는 exercice ;-)는 다른 문제를 유발한다는


주 당신이 둡니다. 예를 들어, 블로그를 다룰 때 블로그가 완전히 초기화됩니까?

0

오른쪽 : ORM이 지연 페칭 (hibernate)을 지원하면 sess.load (class, id)는 실제로 SQL 쿼리를 생성하지 않지만 초기화되지 않은 프록시를 반환합니다.

최대 절전 모드에 대한
0

(하지 NHibernate에,하지만 비슷해야) 내가 개체를로드 할 다음과 같이 일반적으로 HQL 쿼리를 사용할 수 있다고 생각 :

select id from Blog where ... 

을 당신은 블로그 객체로 그를로드 할 수 있습니다 작동합니다 투명하게.그런 다음로드하지 않은 속성에 액세스하면 나머지 내용 (또는 세션의 범위를 벗어난 객체를 전달할 경우 LazyInitializationException)에 대한 쿼리가 트리거됩니다.

일반적으로 컬렉션 및 연결은 지연로드됩니다. 간단한 매개 변수 유형에 대한 상황은 좀 더 복잡하며 쉽게 할 수있는 방법이 있다고 생각하지 않습니다. 거대한 데이터 덩어리 (즉, CLOB 또는 BLOB)를 매핑하는 경우 조금만 속여서 연결을 사용하여 매핑하는 것이 좋습니다.

어떤 경우에도 ORM 프레임 워크에서 변환 작업을 수행하고 있기 때문에 개체를로드하는 방법에 대한 모든 세부적인 사항을 면제받을 수 있습니다. 실제로 데이터 액세스 레이어를 올바르게 설정하는 것은 가장 어려운 과제 중 하나입니다. 특히 Hibernate에 맞지 않는 레거시 데이터베이스로 작업 할 때 간단한 원칙을 유지하십시오.

관련 문제