2014-01-23 1 views
0

lazy 초기화 된 OneToMany 컬렉션에서 최대 절전 모드 @Size 유효성 검사를 사용하려고했습니다. 이 콜렉션에 추가 된 하위 항목과 함께 상위 엔티티를 작성하는 경우 유효성 검사가 지속되도록 적용됩니다. 그러나 단순히 부모 엔티티를 찾고 getChildren()을 수행하면 유효성 검사가 전혀 적용되지 않습니다. 필자는 주석을 getter에두기도했습니다. 그래서 @Size (최대 = 1) 사용하고 있지만 최대 절전 모드 EAGER 가져 오기도 도움이되지 않습니다 경우에도 여전히 모든 예외를 throw하지 않습니다. 현재로서는 getter에 직접 유효성 검사 로직을 넣어야했지만 분명히 이것은 깨끗한 방법이 아닙니다. 친절하게도 누군가가이 문제에 직면했는지 그리고이 일을하는 우아한 방법이 있는지 알려주십시오.프록시 된 컬렉션을위한 Hibernate Validator

답변

1

이벤트 기반 유효성 검사는 지속, 업데이트 및 제거에 대해 트리거됩니다. JPA가 Bean 유효성 검사를 위해 정의한 이벤트입니다 (자세한 내용은 JSR-317 및 JSR-338 사양을 참조하십시오). 엔터티/연결을 데이터베이스에서로드 할 때 유효성 검사가 없습니다. 가 정 데이터는 이미 유효성이 검증 된 것입니다. 시나리오에서 유효성을 검사해야하는 경우 실제로 유효성을 검사해야합니다.

+0

알기 만하면 게으른 게터 호출에 유효성 검사를 적용하는 우아한 방법이 있습니까? 인터셉터 나 다른 구성과 같은 것입니까? 또는 getter 자체에서 Java 논리를 추가하는 것이 유일한 방법입니까? –

+0

인터셉터가 작동 할 것입니다. 그것이 어떻게 보이는지는 당신이 사용하고자하는 기술에 달려 있습니다. PostCollectionUpdateEventListener를 등록하려고 할 수도 있습니다. 로드 된 컬렉션에 대해서도 평점을 가져야 유효성을 검사 할 수 있습니다. 나는 아직도 당신의 유스 케이스를 더 이해하지 않고 이것에 대해 조금 회의적이다. – Hardy

+0

대소 문자는 간단합니다. 하위 컬렉션에 최대 크기 제한이 부과되도록 시행하고 싶습니다. 마치 getChildren()을 수행하는 경우 반환되는 자식 중 <= Max가 아니라는 유효성 검사가 수행되어야합니다. 지금은 내가 지금하고있는 getter의 java 논리를 통해 할 수 있지만 인상이 부족한 @Size는 더 우아하게 처리 할 것이지만 언급 한대로로드하기 위해 불을 지르지는 않습니다. –

1

Hibernate Validator provides two TraversableResolvers out of the box which will be enabled automatically depending on your environment. The first is DefaultTraversableResolver which will always return true for isReachable() and isTraversable(). The second is JPATraversableResolver which gets enabled when Hibernate Validator is used in combination with JPA 2.

TraversableResolver의 자신의 구현을 만들거나 DefaultTraversableResolver를 사용하여 최대 절전 모드 검사기를 구성합니다.

public class MyTraversableResolver implements TraversableResolver { 

    @Override 
    public boolean isReachable(
      Object traversableObject, 
      Node traversableProperty, 
      Class<?> rootBeanType, 
      Path pathToTraversableObject, 
      ElementType elementType) { 
     return true; 
    } 

    @Override 
    public boolean isCascadable(
      Object traversableObject, 
      Node traversableProperty, 
      Class<?> rootBeanType, 
      Path pathToTraversableObject, 
      ElementType elementType) { 
     return true; 
    } 
} 
+0

당신이 Hibernate validator를 구성한다고 말하면 무엇을 구성할까요? lazy로로드 된 콜렉션을 초기화하거나 if-else kinda logic을 통해 사용자 정의 유효성 검사를 시행합니까? –