Java 正在从事务中获取额外惰性集合的.size()
我有一个具有Java 正在从事务中获取额外惰性集合的.size(),java,hibernate,spring-transactions,Java,Hibernate,Spring Transactions,我有一个具有lazy=“extra”属性的一对多集合 Class Foo { List<Bar> barList; } 我使用服务获取FooContainer实体,因此我需要在事务外使用.size() FooContainer fc = serviceImpl.getFCById(fooContainerId); 这样就可以初始化fc.getGoogleist()。然后我只需要得到条列表的大小。我不需要取整个收藏 Class FooContainer { List&l
lazy=“extra”
属性的一对多集合
Class Foo {
List<Bar> barList;
}
我使用服务获取FooContainer实体,因此我需要在事务外使用.size()
FooContainer fc = serviceImpl.getFCById(fooContainerId);
这样就可以初始化fc.getGoogleist()。然后我只需要得到条列表的大小。我不需要取整个收藏
Class FooContainer {
List<Foo> fooList;
}
for(Foo currentItem: fc.getFooList()) {
int barSize = currentItem.getBarList().size();
}
这是LazyInitializationException出现的时间。
我试着调用这个方法
@Transactional
Class AnotherServiceImpl {
int getBarListSize(Foo foo){
return foo.getBarList().size();
}
}
但它不起作用,因为没有会话。
我可以在AnotherServiceImpl
中执行getHibernateTemplate().getCurrentSession.initialize(foo.getBarList())
,这将起作用,但我可能会获取所有项,这是不可接受的
有没有一种方法可以在不获取的情况下获取集合大小?以及我获取FooContainer fc和call的comment方法。size()是相同的方法,它不是@Transactional
:
由于提交的事务而返回FooContainer时,实体将处于非托管状态,因此无法解析“额外”-惰性集合。如果调用方法也是事务性的,那么它也可以工作
我看到您有以下选项,您可以:
使用默认传播使调用方法也具有事务性
或者将foo合并到getBarListSize中有效的hibernate会话中,以使其再次被管理
或者将Foo中的barList设置为Lazy(false),然后在加载FooContainer的过程中获取所有内容。(但这似乎是不可接受的)
或者使用GROUPBY语句获取大小
相关:我怀疑这是一个实体被管理与否的问题。您应该添加用于创建FooContainer和getBarListSize调用方法的事务传播。@aschoerkServiceImpl
和AnotherServiceImpl
在此处具有默认传播。获取FooContainer fc
并调用.size()
的方法是相同的方法,它不是@Transactional
。