2014-02-24 1 views
0

우리 개발팀에는 큰 문제가있다.Hibernate는 many-to-one을 묻지 않고 검색한다.

우리는 Hibernate를 사용하고 있으며 우리는 2 개의 전 이적 일대 다 관계에 관련된 몇몇 엔티티를 가지고있다. 주 개체는 속성 인스턴스 목록이있는 그룹이며 각 속성은 값 목록을 포함합니다.

우리는 두 가지 문제가

(매핑 앞서 다운) :

A)를 HQL 쿼리, 기준 쿼리를 만들거나은 SQLQuery는이 조건이 적용 문제가되지 않는 경우이 절을 조인 또는 WHERE Hibernate는 항상 모든 기본 객체를 검색한다. 예를 들어, Criteria 나 SQL을 Group 객체 만 가져 오면 Hibernate가 나오고 (lazy 또는 not) 모든 Property 및 Value 인스턴스를 가져옵니다. 우리는 이것을 통제하기를 원합니다. 우리는 왼쪽 조인을하고 내부에 값이없는 속성 만 가져오고 싶습니다 (Hibernate는 값없이 이러한 속성을 제거합니다).

B) 쿼리를 만들 때 SQL과 같은 쿼리를 만들 때 우리는 SQL 코드 필요. 모든 것이 완벽 해 보입니다. 하지만 그 후에는 조건을 적용하지 않고 모든 인스턴스를 ID로 가져오고 lazy = "true"로 설정하면 로그에 "다 대일로드"쿼리가 표시되기 때문에이를 보장 할 수 있습니다.

최대 절전 모드 구성, 모드/전략 가져 오기, 매핑 구성 또는 다른 곳에서 수행 할 수있는 작업이 있습니까? 나는 결과 변압기에 지금가는 것을 생각하고있다.

누군가가 나에게 힌트를 주거나이 문제에 대한 해결책을 어디에서 찾을 수 있는지 말해 주시면 감사하겠습니다. 우리는 이것을 얻는 방법에 대해 혼란 스럽지만 방법이어야합니다. 사전에

감사

검색어 :

Criteria lstCriterios = this.getSession().createCriteria(CardGroup.class, CARD_GROUP) 
      .add(Restrictions.eq(ID_CATEGORY, idCategory)); 

    lstCriterios.createAlias("listProperty", "listProperty", CriteriaSpecification.LEFT_JOIN); 

    if (clusterId != null) { 
     lstCriterios.add(Restrictions.or(
       Restrictions.isNull("listPropertyValue" + ".value"), 
       Restrictions.and(Restrictions.eq("listPropertyValue" + ".clusterId", clusterId), 
         Restrictions.eq("listPropertValue" + ".companyWarehouseId", idCompanyWarehouse)))); 
     lstCriterios 
       .createAlias("listProperty" + "." + "listPropertyValue", "listPropertyValue", 
         CriteriaSpecification.LEFT_JOIN, 
         Restrictions.eq("listPropertyValue" + ".clusterId", clusterId)); 
    } else { 
     lstCriterios.createAlias("listProperty" + ".listPropertyValue", "listPropertyValue", 
       CriteriaSpecification.LEFT_JOIN); 
    } 

    lstCriterios.add(Restrictions.eq(ID_CATEGORY, idCategory)); 
    lstCriterios.add(Restrictions.eq("listProperty" + ".groupId", idGroup)); 
    lstCriterios.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
    /* 
    * Sorting 
    */ 
    lstCriterios.addOrder(Order.asc("order")); 
    lstCriterios.addOrder(Order.asc("listProperty" + ".order")); 


    lstCriterios.addOrder(Order.asc("listPropertyValue"+ ".clusterId")); // Agrupacion, podría ser nulo 
    lstCriterios.addOrder(Order.asc("listPropertyValue"+ ".propertyId")); // Propiedad 
    lstCriterios.addOrder(Order.asc("listPropertyValue"+ ".id")); 

    return lstCriterios.list(); 

그룹 매핑 :

<list name="listProperty" 
     table="FICHA_PROPIEDAD" schema="${db2.siglo.schema}" 
     inverse="false" cascade="all" > 

     <key column="ID_FICHA_GRUPO" not-null="false" /> 
     <list-index column="ORDEN" base="1"/> 

     <one-to-many 
      class="com.company.aslo.appwebsiglo.model.card.property.property.CardProperty" /> 
</list> 

속성 매핑 : 우리의 모델 설계가 나쁜와 같은

<bag name="listPropertyValue" 
     table="FICHA_PROPIEDAD_VALOR" schema="${db2.siglo.schema}" 
     inverse="false" cascade="all"> 

     <key column="ID_FICHA_PROPIEDAD" not-null="false" /> 
     <one-to-many 
      class="com.company.aslo.appwebsiglo.model.card.propertyvalue.propertyvalue.CardPropertyValue" /> 
</bag> 
+1

노력하고있는 기준/HQL 쿼리를 게시 할 수 있습니까? – Shane

+0

목록에서 lazy = true를 사용하려고 했습니까? – Zeus

+0

예, 했어요. 아무것도 바뀌지 않습니다. – madtyn

답변

0

보인다 우리 실현하지 않았다 DB 테이블 FICHA_PROPIEDAD_VALOR에 복합 키가있는 경우 예기치 않은 결과가 발생하므로 복합 키의 속성 중 하나만 매핑 할 수 없습니다.

이것과 중첩 된 객체 때문에, 우리는 Hibernate가 사용하는 hashCode()와 equals() 메소드의 나쁜 구현을 가지고있다.

이전에 ResultTransformer가 SQLQuery에서 행을 가져와이 문제를 해결했지만 리팩토링과 모델 디자인 변경 후 최대 절전 모드 솔루션을 얻었습니다.

관련 문제