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

@计划@事务惰性初始化收集错误-没有代理

云飞翮
2023-03-14

我们已经用Spring 4、Hibernate、repositories和JPA开发了一个网站大约一年了。在通过endpoint检索数据时,我们使用OpenEntityManagerViewFilter保持会话打开,但最近一直在处理计划的操作,现在遇到了问题。

我们在一个类中有一个带有@Scheduled注释的方法,在另一个类中有另一个带有@Transactional注释的方法。调用方法查找文件系统上的数据,并将其传递给第二个类/方法。

下面是代码的简化版本:

<code>
// metadataRepository 
    @Transactional
    public Metadata findOneById(String uuid);


    @Transactional
    public void processQueueMessages(Map<String, MessageAttributeValue> attributes ) throws IOException{
        Metadata metadata = null;
        try{
            metadata = metadataRepository.findOneById(uuid);

            // REST call to get list of locations
            GeotaggerList locationList = response.getResult();

            // this call just maps fields, no database interaction
            Map<String, GeoLocation> locationNameMap = metadataService.getKwebLocations(locationList, null);
            for (Map.Entry<String, GeoLocation> entry : locationNameMap.entrySet()){
                entry.getValue().setMetadata(metadata);
                metadata.getGeoLocations().add(entry.getValue());  //fails
            }
            metadataService.save(metadata, username);
            }
        } catch (Exception e){
            e.printStackTrace();
            return;
        }
</code>

调用processQueueMessages的方法/类具有@Scheduled注释。我尝试在调用者上添加@Transactional注释,但没有成功。

我尝试过放置注释的几种变体,但总是会出现以下错误:org。冬眠LazyInitializationException:未能延迟初始化角色的集合:。领域元数据。地理位置,无法初始化代理-无会话

我不能在元数据域对象的定义中进行快速获取,因为它被用于很多我们不希望快速加载的地方。

我愿意接受建议。

共有3个答案

温星华
2023-03-14

似乎元数据对象在从metadataRepository检索后已经脱离了事务性会话,否则抛出懒惰异常是没有意义的。检查metadataRepository.findOneById(uuid)没有在单独的事务中运行,例如将其标记为REQUIRES_NEW

为了防止延迟加载异常,应该在调用metadataRepository中预加载数据。只需调用元数据就可以找到donebyid。getGeoLocations()。isEmpty()或通过使用fetch-join查询急切地检索数据

姬振濂
2023-03-14

您可以尝试使用Hibernate获取配置文件。

https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/performance.html#performance-获取配置文件

基本上,默认情况下,在模型上保持相同的延迟加载,但创建一个获取配置文件,该配置文件急切地加载您的地理位置属性。然后,当您从计划的方法加载元数据时,激活您的获取配置文件。

谭裕
2023-03-14

经过大量的搜索,答案很简单,就像往常一样。我使用一个配置类,它需要@EnableTransactionManagement的注释

答案就在Spring资料留档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html

那一页我一定读了十几遍,但没有读到关键的陈述。

 类似资料:
  • 我正在开发一个Struts2 Spring Hibernate webapp,我需要在检索一个对象或该对象的集合后初始化一个惰性集合。 用例 我有一个团队模型,其关系被热切地加载为员工(我认为这显然是一个集合)。反过来,员工模型有一个懒惰的关系注册表,我只需要一些特定的操作,所以我根本不需要急切地加载它。 现在。我调用我的(用Spring注入到我的Struts2控制器中),以便检索一个特定的已经加

  • 问题内容: 在我的JavaFX应用程序中,当我对EmbeddedId类使用 Non Lazy Collection 选项时,为了保持双向关系,它将产生以下异常。经过几个小时的工作后,我仍然无法解决它。实体类如下。谢谢。 EmbeddedId类 WorkflowStep实体 (带有EmbeddedId) WfScriptTemplate实体 (带有双向关系) PostgreSQL异常 MySQL异常

  • 当我从angular发送post请求时,在spring boot requestfilter程序中,验证jwt令牌时显示错误。 面对问题: 未能懒惰地初始化角色集合:in.yis.mains.model.opsuserslogin.roles,无法初始化代理-没有会话

  • 我有下一个错误: 但是当我试图调用这个方法时,我在在上调用时也会出现同样的异常。我已经检查了事务管理器,它配置正确,事务在这一步中存在。此外,我已经检查了大量与此异常相关的stackoverflow的答案,但没有任何有用的。 它的原因是什么?

  • 错误被抛出在行hibernate.initialize(students)上;或者在下一行,如果没有,在学生集上,标题中有错误。任何帮助(不仅仅是将fetch类型设置为Eager)都将不胜感激。

  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。