나는 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
와 함께
관련 : https://stackoverflow.com/questions/2198528/hibernate-hql-get-count-of-results-without-actually-returning-them – Moira
내가 관리 여부되는 엔티티의 문제 용의자 . FooContainer와 getBarListSize 호출 메소드를 생성하기 위해 Transaction-Propagation이 사용되는 것을 추가해야한다. – aschoerk
@aschoerk'ServiceImpl'과'AnotherServiceImpl'에는 여기에 기본 전파가 있습니다. 'FooContainer fc'를 얻고'.size()'를 호출하는 메소드는 같은 메소드이고'@ Transactional'이 아닙니다. – Nalmelune