2012-08-17 2 views
5

많은면을 페이지 매김해야하는 최대 절전 모드에서 일대 다 관계를 어떻게 매핑 할 수 있습니까? (예 : 수백 개 이상의 관련 객체가 있음)
OneToMany 주석 (또는 해당 xml 해당 항목)을 사용하면 유용하지 않습니다. 한쪽 객체를로드하면 관련 객체가 모두 검색되어 메모리 재난을 일으킬 수 있기 때문입니다 (lazy 로딩).
가능한 접근법 (이미 사용하고 있습니다)은 페이지 매김 매개 변수를 도입 할 수있는 DAO 구현에 getter 메서드를 추가하는 것입니다. 그러나 캐스 케이 딩 (예 : 개체를 연결하는 데 DAO 클래스에 setter 메서드를 포함해야하는 등)와 같은 일부 기능을 잃어 버리기 때문에 이것이 이상적이지 않습니다. 게다가, 한쪽 객체는 관련 many-side 객체를 검색하는 메소드가 없기 때문에 일부 OOP 감각을 잃게됩니다. 가장 좋은 솔루션은 무엇입니까?
더 많은 것을 설명하기 위해 두 클래스 사이에 다음과 같은 관계가 있다고 가정 해 보겠습니다. A가 많음 B
OneToMany 주석을 사용하여 A.getAllB() 메서드를 작성할 수 없습니다. 따라서 결과에 페이지 매김을 적용하려면 getAllB() 메서드를 사용하여 별도의 ADaoImpl 클래스를 만들고 여기서 페이지 매기기 매개 변수를 포함시켜 한 번에 한 페이지의 데이터 만 반환 할 수 있습니다. 이 올바른지? 어떤 도움을 주시면 감사하겠습니다.하이버 네이트 페이지 매김 OneToMany 관계

답변

2

나는 당신이 제안하고있는 것과 똑같은 일을 할 것이라고 생각한다 : 페이지 매김 매개 변수를 취하고 지정된 결과 페이지를 반환하는 나의 DAO에 새로운 메소드를 만든다. 자녀를 부모 개체에 보관하기를 원하는지 여부는 귀하에게 달려 있습니다. 이러한 객체에 대해 임시 필드를 만들 수 있습니다.

public class Parent { 
    @Transient 
    private List<Child> children; 

    } 

    public class ParentDao { 

    // Solution 1 - You can keep the parent/child association 
    public void loadChildren(Parent parent, int firstResult, int maxResults) { 
     // do your query 
     parent.setChildren(query.list()); 
    } 

    // Solution 2 - Or just have your dao directly return the children and remove the list from Parent 
    public List<Children> getChildren(Parent parent, int firstResult, int maxResults) { 
     // do your query 
     return query.list(); 
    } 
    } 

나는 당신이 코드의 당신의 OO 느낌을 깨는에 대해 무엇을 의미하는지 알고있다. 하지만 실제로 페이지 매김은 데이터 계층의 기능입니다. 첫 번째 솔루션을 사용하면 멋진 "OO"느낌을 복원 할 수 있습니다.

관련 문제