Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在从事务中获取额外惰性集合的.size()_Java_Hibernate_Spring Transactions - Fatal编程技术网

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调用方法的事务传播。@aschoerk
    ServiceImpl
    AnotherServiceImpl
    在此处具有默认传播。获取
    FooContainer fc
    并调用
    .size()
    的方法是相同的方法,它不是
    @Transactional