2017-11-29 15 views
0

나는 lazy="extra" 속성을 가진 일대 다 수집이 있습니다..size() 트랜잭션 외부 여분의 수집의 얻으십시오

Class Foo { 
    List<Bar> barList; 
} 

여기에는 언급 된 클래스 컬렉션이 포함 된 lazy="false" 초기화가있는 클래스가 있습니다.

Class FooContainer { 
    List<Foo> fooList; 
} 

나는 서비스 FooContainer 엔티티를 얻을, 그래서 나는 거래에서 .size()를 사용해야합니다;

FooContainer fc = serviceImpl.getFCById(fooContainerId); 

이렇게하면 fc.getFooList()가 초기화됩니다. 그렇다면 barList 크기 만 받아야합니다. 나는 전체 컬렉션을 가져올 필요가 없습니다.

for(Foo currentItem: fc.getFooList()) { 
    int barSize = currentItem.getBarList().size(); 
} 

LazyInitializationException이 나타나는 경우입니다. 이 메서드를 호출하려고했습니다.

@Transactional 
Class AnotherServiceImpl { 
    int getBarListSize(Foo foo){ 
     return foo.getBarList().size(); 
    } 
} 

세션이 없으므로 작동하지 않았습니다. getHibernateTemplate().getCurrentSession.initialize(foo.getBarList())AnotherServiceImpl에 넣을 수는 있지만이 방법은 효과적 일 수 있습니다.하지만 받아 들일 수없는 모든 항목을 가져올 것입니다.

가져 오기없이 컬렉션 크기를 얻을 수있는 방법이 있습니까? 주석 Method where I get FooContainer fc and call .size() is the same method and it is not @Transactional와 함께

+0

관련 : https://stackoverflow.com/questions/2198528/hibernate-hql-get-count-of-results-without-actually-returning-them – Moira

+1

내가 관리 여부되는 엔티티의 문제 용의자 . FooContainer와 getBarListSize 호출 메소드를 생성하기 위해 Transaction-Propagation이 사용되는 것을 추가해야한다. – aschoerk

+0

@aschoerk'ServiceImpl'과'AnotherServiceImpl'에는 여기에 기본 전파가 있습니다. 'FooContainer fc'를 얻고'.size()'를 호출하는 메소드는 같은 메소드이고'@ Transactional'이 아닙니다. – Nalmelune

답변

0

:

FooContainer이 때문에 커밋 된 트랜잭션 따라서 "추가"-lazy 컬렉션 해결되지 수의 반환 될 때 개체가 관리되지 않는 얻을. 호출하는 메소드가 Transactional 인 경우에도 작동합니다.

당신은 당신이 할 수있는, 내가 보는 다음과 같은 옵션이 있습니다

  1. 는 호출 방법은 또한 기본 전파
  2. 와 트랜잭션 또는 다시 관리하기 위해 getBarListSize 유효 최대 절전 모드 세션에 foo에 병합합니다.
  3. 또는 barList를 Foo에 넣고 Lazy (거짓)하면 FooContainer를로드하는 동안 모든 것이 인출됩니다. (하지만 그건 받아 들일 수없는 것 같습니다)
  4. 또는 그룹 별 명세서를 사용하여 크기를 얻으십시오.