当前位置: 首页 > 知识库问答 >
问题:

延迟加载可以工作,但不应该

乐成济
2023-03-14

这个问题的上下文是在sping-boot中,使用sping-data-jpa和hibernate。

一个同事写了一个@Service,并用@Transactional注释了service方法。服务方法加载一个实体,然后命中一个一对多延迟加载的集合(finch=FetchType)。懒惰的代码。服务方法是由一些自定义委托调用,我将返回到。当从@RestController终结点调用时,此操作正常。

当我从camel路由(同样是通过定制的delegator)调用该服务时,它发出了一个延迟初始化异常。

在挖掘时,发现服务实现了一个接口,自定义委托器会查找该服务(它被注入,因此具有适当的代理),并在接口上调用一个方法,该方法实际上是java-8默认方法。然后,此默认方法在本地调用@Transactional方法。

所以有一个问题:-这是一个本地方法调用,所以没有完成@Transactional批注的检测/代理操作(我们使用aspectJAutoProxy),所以在事务中没有调用该方法,所以延迟加载应该失败。为了再次检查,还尝试了通过@计划的注释:相同的行为。像它应该呕吐。

我的问题:那么为什么从@RestController调用时它会工作呢?这简直快把我逼疯了!

rest控制器终结点上没有事务性注释。

我使用TransactionSynChronizationManager.isActualTransactionActive()向服务添加了一些调试代码,它显示在任何情况下都没有事务,即使是通过控制器endpoint调用。

那么,为什么当从控制器调用时,延迟加载工作?我转储了所有SQL,并且在任何时候都没有加载延迟集合,所以它们不在任何Hibernate缓存中。

我记得有一次读到,延迟加载是一种提示,不是命令,但仍然。。。为什么在这种情况下有效?


共有1个答案

薛宜
2023-03-14

在多次对此感到困惑之后,我偶然发现了答案:

sprint boot是通过OpenEntityManagerView拦截器在我们背后执行一个开放实体管理器。我不知道这是怎么回事。

看看Vlad Mihalcea的精彩回答https://stackoverflow.com/a/48222934/208687

 类似资料:
  • 使用PrimeFaces 5.0。 我的datable使用延迟加载和实时滚动,我尝试过滤这两个字段: 初始加载正确检索数据,实时滚动似乎工作正常。 但当我试图过滤其中一个字段时,数据表被完全清空(它甚至没有显示“找不到记录”消息)。当我调试时,我可以看到我的查询被正确执行并返回数据。 此外,如果我使用分页而不是liveScroll切换,页面会被正确延迟加载,过滤器也可以工作。 有什么想法吗?

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 问题内容: 我已使用批注将其用于获取计算的属性。我需要的是那些用注解注解的字段/获取器应延迟加载。 这甚至有可能吗? 谢谢 问题答案: 是的。只需使用@Basic(fetch = FetchType.LAZY) 注释属性的字段/ 获取器,然后使用hibernate提供的此ant任务即可为实体类进行字节码检测。否则,将默默忽略该属性的LAZY加载。 该文档包含有关如何使用此ant任务进行字节码检测的

  • 问题内容: 我有一个包含5000多个数据记录的网格。这些数据每天都在增长。当我用网格加载页面时,网格显示数据几乎要花一分钟,我必须一次显示10行。 然后可以使用此jqGrid实现延迟加载吗? 这是我生成JSon字符串的操作: 这是带有jqGrid的页面: 请参阅下面的查询: 我在上述操作中设置的限制金额。该值为10。 问题答案: 好的,所以这是一个基于JPA的部分答案(但是我想让它适应Hibern

  • 我正在使用这个插件jQuery延迟内容、图像和背景延迟加载程序 我尝试在延迟加载后向图像添加图像边框颜色和图像边框厚度,但似乎没有效果。若我在开发者控制台按“inspect”,我可以看到这个属性被添加到图像样式中,但它的效果并没有显示在屏幕上。 超文本标记语言 JQuery

  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想