2009-09-21 3 views
8

다음과 같은 Hibernate 매핑 클래스가 있다고 가정 해보십시오.Hibernate에서 Null과 빈 콜렉션

public class ClassA {  
    @OneToMany(fetch=EAGER) 
    private List<ClassB> bList; 
} 

최대 절전 모드 세션에서 ClassA의 개체를 읽을 때 PersistentList 필드는 PersistentList 개체로 예상대로 초기화됩니다.

목록이 비어있는 상황에서 비어있는 PersistentList이 아닌 null 필드를 null로 초기화하기 위해 최대 절전 모드가 필요하다는 요구 사항이 있습니다. 이론적으로, Hibernate는 이것을하기 위해 필요한 정보를 가지고있다. 왜냐하면리스트상의 가져 오기가 열성적이기 때문이다. 문제는 section 6.1 of the Hibernate docs에 따라 다음과 같습니다.

기본 관계형 모델로 인해 컬렉션 값 속성은 가 null 값 의미를 지원하지 않습니다. Hibernate는 과 null 콜렉션 레퍼런스와 빈 콜렉션을 구별하지 않는다.

이것은 완벽하게 이해할 수 있지만, 누군가가이 제한을 극복하기위한 교묘 한 규칙을 생각해 낼 수 있기를 바랍니다. 어쩌면 일부 청취자/콜백 메커니즘이 빈 목록을 null 참조로 바꿀 수 있다고 생각합니다.

답변

8

getbList() 메소드를 체크인하려고 했습니까?

if(bList.isEmpty()) 
    return null; 
return bList; 

Hibernate는 항상 참조에 대한 객체를 생성합니다,하지만 당신은 게터와 세터의 내부 데이터를 제어 할 수 있습니다 : 당신은 할 수 있습니다. 목록에 요소가있는 경우 항상 null을 반환 할 수 있습니다.

+0

, 그래 – skaffman

+0

...하지만 당신이 올바른 것, 느리게로드 기관 : –

2

이는 "제한 '을 고려하는 이유가 궁금는? - 널 bList 실제로 다른 내가 생각 빈 bList

보다 응용 프로그램에 의미를 가지고 대부분의 지역에서, 널 모음 그리고 빈 콜렉션은 의미 론적 의미가 같아서 Hibernate 개발자가 Hibernate를 하나만 사용하도록 제한하려는 이유를 짐작할 수 있습니다. if (bList == null || bList.isEmpty)을 확인하는 것이 항상 의미가 없습니다.

+1

그것은 대부분의 경우에 매우 좋지 않다,하지만이 특정 객체의 클라이언트 모델은 null과 empty를 구별하는데, 나는 그것을 제어 할 수 없다. – skaffman

2

귀하의 코드에서 처리하는 방법은 getter에서 명백한 방법이지만 도움이되지는 않습니다. 당신이 HQL에서 그것을 평가하기를 원한다면

두 아이디어 :

  • NULL에 비어있는 경우를 설정하는 생성자입니다.
  • @PostLoad/@PostConstruct 같은 것을하는 방법.
  • 나는 이것이 가장 간단한 해결책 끝나게 수 있습니다 생각
+0

아, 나는 @PostLoad에 대해 몰랐다. 나는 그것을 좋아한다. @PostConstruct와 어떻게 상호 작용합니까? – skaffman