2012-06-12 4 views
1

데이터베이스 내에 오브젝트의 큰 트리를 저장하는 가장 좋은 방법은 무엇인지 궁금합니다. 지금까지 내가 folowing 있습니다JPA 지연 디자인 어드 바이스

@Entity 
class Element1 { 
    @OneToMany(fetch=FetchType.LAZY) 
    Collection<Element2> elements; 
    .... 
} 

페치 유형이 항상 필요하지 않습니다 element2에 beacause를 LAZY로 설정되어 정말 거대한 (다른 요소의 컬렉션 컬렉션의 컬렉션)이 될 수 있습니다.

문제는 서블릿 (세션이 닫혀 있음)에서 Element2 유형의 요소를 검색 할 때, (물론) lazyness 예외를 얻는 것입니다. 첫 번째 해결책은 쿼리 내에서 요소 컬렉션을 열렬히 가져 오는 것이지만 어떻게해야하는지 언제 알 수 있습니까? 내가 방법을 생성해야합니까 :

Element1 get(Integer Id); 
Element1 getEager(Integer Id); 

내가 매핑 "반대"Element1이의 필드 요소를 제거하고 수 있는지 궁금 :

: 두 가지 방법을 다음

class Element2 { 
    @ManyToOne 
    Element1 owner; 

    ..... 
} 

Element1 get(Integer Id); 
Collection<Element2> getElements(Element1 owner); 

그런 일을하는 가장 좋은 방법은 무엇입니까?

감사합니다.

답변

1

질문에 설명하는 모든 것을 할 수 있지만 두 번째 옵션은 내가하는 것과 다릅니다. element1에서 element2의 목록으로 이동해야하는 경우 OneToMany 연결을 사용하는 것은 당연하고 당연한 일입니다. 연결은 양방향 일 수 있습니다. 즉, 부모에서 자식으로, 자식에서 부모로 동시에 탐색하도록 선택할 수 있습니다.

첫 번째 해결 방법은 element1을 반환하는 메서드와 그 하위 요소와 함께 element1을 반환하는 메서드입니다. 하지만 더 의미있는 이름을 선택할 것입니다.

+0

감사합니다. 마지막 질문 하나만 있다면, Element1이 완전히 가져 오지 않은 경우에 DTO를 사용하는 것이 더 바람직할까요? 아니면 원래 Element1 클래스를 그대로 사용할 수 있습니까? 가장 일반적인 것은 무엇입니까? – user1047847