从事务中获取额外延迟集合的.size()

时间:2017-11-29 18:11:32

标签: java hibernate spring-transactions

我有一个带有lazy="extra"属性的一对多集合。

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进行此操作,但我可能会抓取所有项目,这是不可接受的。

有没有办法在不提取的情况下获取集合大小?

1 个答案:

答案 0 :(得分:0)

与评论Method where I get FooContainer fc and call .size() is the same method and it is not @Transactional

一起使用

由于提交的事务而返回FooContainer时实体变得非托管,因此无法解析“额外”-lazy集合。如果调用方法也是Transactional也可以。

我有以下选项,您可以:

  1. 使调用方法也具有默认传播的Transactional
  2. 或将foo合并到getBarListSize中有效的hibernate会话中,以便再次进行管理。
  3. 或使Foo中的barList也为Lazy(false),然后在加载FooContainer期间获取所有内容。 (但这似乎是不可接受的)
  4. 或使用group by语句获取大小。