2011-10-25 3 views
2

나는 클래스 레벨에서 @Where 속성을 가진 Hibernate 엔티티에 주석을 달았다. 이렇게하면 직접 쿼리 할 때로드되는 엔티티가 제한되지만 해당 클래스의 컬렉션에는 적용되지 않는 것 같습니다. 기대 되는가?Hibernate - 클래스 레벨 @ 해당 클래스의 콜렉션에 어노테이션이 적용되지 않습니까?

워드 프로세서는이에 명확하지 않다 : http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class (옵션)

: 조건이이 클래스의 객체들을 검색 할 때 사용 될 수있는 임의의 SQL을 지정합니다.

저에게 들리는 것은 저 클래스의 객체가 검색되는 모든 경우에 적용되는 것처럼 들리지만 컬렉션에 대해 무시되는 것을 관찰했습니다.

  1. 이것은 컬렉션을 위해 작동합니까?
  2. 그렇지 않은 경우 클래스의 모든 인스턴스와 해당 클래스의 모든 컬렉션에 필터를 전역으로 적용하는 가장 좋은 방법은 무엇입니까?

(업데이트 :. 나는 문서의 문제를 추적 할 수 https://hibernate.atlassian.net/browse/HHH-6781 제기) "를 getAll"또는 "LOADALL"를 사용하는 경우 클래스 수준에서

+0

작동해야하는 것처럼 보입니다. 컬렉션을위한 것이지만 그렇지 않은 경우 문서가이를 분명히해야합니다. 나는 제기했다. https://hibernate.onjira.com/browse/HHH-6781 – Rich

+0

동일한 문제가 발생하지만 클래스를 직접 기준 API를 통해 'createCriteria (MyEntity.class) .scroll()'로 질의 할 때 발생한다. 어떤 경우에 HQL 또는 Criteria API를 사용 했습니까? – Vlad

+0

기준 (list()가 아닌 scroll())을 사용하고 있었지만 차이점을 기대하지 않았습니다. – Rich

답변

1

@Where는 원치 않는 인스턴스를 생략합니다. @Where를 클래스 수준에서 사용하면 해당 엔티티의 컬렉션에 적용하기 위해 "계단식"으로 정렬되지 않습니다. 컬렉션 속성 수준에서

@Where 공용 클래스 PuppySeller {

@Where(clause = "status='FOR_SALE'") 
    public Set<Puppy> getPuppiesForSale() {} 

당신은 DB에서 "PuppySeller"를 선택하면, "puppiesForSale"단지 "FOR_SALE"로 강아지에 의해 채워집니다 것을 보장합니다 지위.

그러나 첫 번째 수준의 수집에만 적용되기 때문에 매우 신중해야합니다. 제가이 말을하는 것은 강아지가 있고, 동일한 판매자가 모든 강아지를 팔고 싶어한다는 것입니다. "myPuppy.getPuppySeller(). getPuppiesForSale()"과 같은 작업을 수행 할 수 있습니다. 그러나 이렇게하면 상태에 관계없이 puppySeller에 속한 모든 강아지 ("판매 된"또는 "신생아"등)을 포함한 모든 강아지가됩니다.

+0

감사합니다. 나는 이것이 대부분 문서화 버그라고 생각한다. 내가 예상했던대로 행동을 바꾸는 것이 때로는 유용 할지라도 BC가 깨질 수 있다고 생각합니다. 나는 문서 수정을 추적하기 위해이 표를 올렸다 : https://hibernate.atlassian.net/browse/HHH-6781 – Rich

관련 문제