2013-01-17 5 views
0

에 게으른 부하를 유발 ...Hibernate는 프록시를 초기화하지 수 - 아니 세션 : LCDS 일부 더러운 사업은 AMF 서블릿에서 일어나는 모든 컬렉션

임없이 DTO의 목록을 검색 supused하는 DAO 메소드를 호출

public List<NivelesPlantillasDto> getList()throws HibernateException{ 
     logger.info("getList()"); 
     List<NivelesPlantillasDto> list = new ArrayList<NivelesPlantillasDto>(); 
     Session session = null; 
     try{ 
      session = SessionFactory.getInstance().openSession(); 
      list=(List<NivelesPlantillasDto>)session.createQuery("from NivelesPlantillasDto").list(); 
     }catch(HibernateException HE){ 
      logger.info(HE.getMessage(),HE); 
      if (session!=null && session.isConnected()) 
       session.close(); 
      throw HE; 
     } 
     if (session.isConnected()) 
      session.close(); 
     return list; 
    } 

을 그리고 이것은, BECA이 오류는 세션을 종료 후 오는 hbm.xml

<hibernate-mapping> 
    <class name="architecture.dto.NivelesPlantillasDto" table="nivelesplantillas"> 
     <id name="pkNivelPlantilla" type="int"> 
      <column name="PKNIVELPLANTILLA" /> 
      <generator class="identity" /> 
     </id> 
     <property name="plantilla" type="java.lang.String"> 
      <column name="PLANTILLA" /> 
     </property> 
     <set name="habilidadesList" table="habilidades" inverse="true" lazy="true"> 
      <key foreign-key="FKNIVELESPLANTILLAS" not-null="true"> 
       <column name="FKNIVELESPLANTILLAS" sql-type="int"/> 
      </key> 
      <one-to-many class="architecture.dto.HabilidadesDto"/> 
     </set> 
     <set name="nivelesList" table="niveles" inverse="true" cascade="merge,delete-orphan" order-by="indice" lazy="true"> 
      <key foreign-key="FKNIVELESPLANTILLAS" not-null="true"> 
       <column name="FKNIVELESPLANTILLAS" sql-type="int"/> 
      </key> 
      <one-to-many class="architecture.dto.NivelesDto"/> 
     </set> 
     <property name="activo" type="boolean"> 
      <column name="ACTIVO" /> 
     </property> 
    </class> 
</hibernate-mapping> 

입니다 : 자바에서 원격 개체를 통해 어떤 아이들은 플렉스하기 Hibernate가 객체를 AMF Servlet에서 deserialize 할 때이 클래스의 모든 자식을로드하려고 시도 할 때 세션을 열린 상태로 두어 모든 자식에 대한 쿼리를 볼 수 있습니다. 따라서이 오류에 대한 2 가지 수정 사항이 없어지므로 하나는 일대 다 관계에 lazy="false"을 설정하고 두 번째는 AMF가 모든 하위 항목을로드 할 때까지 세션을 열린 채로 두는 것이지만 원하는 것은 아닙니다. 왜 모든 어린이들을 강제로 강제로 끌고 가야합니까?

편집 : 좋아, 난 못생긴 방식으로 수정 ... 목록의 복제본을 검색 했으므로이 하나가 deserialize되면 어떤 최대 절전 모드 쿼리도 트리거되지 않습니다. 컬렉션이 게으르게로드되는 것을 LCDS에 알릴 수있는 방법이 있습니까?

답변

0

LCDS에 게이지로드가 지연되고 있음을 알리는 방법이 있습니까?

아니요. 나는 당신이 "Open Session in View"패턴을 구현하는 것을 고려해야한다고 생각합니다. 당신의 패턴은 적절한 사용 사례입니다.

내가 게으른 로딩에 더 나은 방법과 size 작동있을 수 있음을 지적하고자하는 OP에서 제공하는 "답"을 바탕으로 업데이트

. Hibernate는 필요할 때만 전체 컬렉션을로드하는 대신 데이터베이스에 대해 select count(... 문을 발행하는 extra-lazy 콜렉션을 지원한다. 이 특수 효과를 추가하기 만하면됩니다.

@LazyCollection(LazyCollectionOption.EXTRA) 

자세한 내용은 http://www.frightanic.com/2010/11/21/extra-lazy-one-to-many-mapping-with-hibernate/을 참조하십시오.

+0

게으른 관계가 아닌 완전히 느린 응용 프로그램을 수정하면 모든 것을 복제해야하는 바인딩 된 개체를 일반 개체로 바꿀 수 있습니까? – Ziul

+0

@ user1601662 "모든 것을 복제하는 것과 관련이없는 바인딩 된 객체를 일반 객체로 변환"- 미안하지만 이해가 안됩니다. –

+0

게으른 콜렉션이 프록시 객체로 검색된다는 것을 의미합니다. 런타임에 일반 객체를 가져 오는 방법이 있습니까? – Ziul

0

좋아, 이제 알았어. 게으른로드 된 컬렉션에서 list.size()를 실행하면 최대 절전 모드로 모든 자식이로드되고 컬렉션이 null이 아니기 때문에 AMF 서블릿이 컬렉션이 null인지 확인한 다음 크기가 0 일 때 컬렉션의 전체로드가 트리거됩니다. 그래서 빠른 참조는 게으른 콜렉션을 찾고 null로 설정하는 모든 참조를 반복하는 것이 었습니다.

+0

나는 그것에 대한 더 나은 접근법이 있다고 생각합니다 ... 업데이트 된 답변을보십시오. –