Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 @计划的@Transactional lazy Int集合错误-无代理_Java_Hibernate_Jpa_Scheduled Tasks_Transactional - Fatal编程技术网

Java @计划的@Transactional lazy Int集合错误-无代理

Java @计划的@Transactional lazy Int集合错误-无代理,java,hibernate,jpa,scheduled-tasks,transactional,Java,Hibernate,Jpa,Scheduled Tasks,Transactional,我们已经使用Spring4、Hibernate、repositories和JPA开发了一个网站大约一年了。我们使用OpenEntityManagerInViewFilter在通过端点检索数据时保持会话打开,但最近一直在处理计划的操作,现在遇到了问题 我们在一个类中有一个带有@Scheduled注释的方法,在另一个类中有另一个带有@Transactional注释的方法。调用方法查找文件系统上的数据并将其传递给第二个类/方法 下面是代码的简化版本: <code> // metadataR

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

我们在一个类中有一个带有@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>

//元数据存储库
@交易的
公共元数据findOneById(字符串uuid);
@交易的
public void processQueueMessages(映射属性)引发IOException{
元数据=null;
试一试{
元数据=metadataRepository.findOneById(uuid);
//REST调用以获取位置列表
GeotaggerList locationList=response.getResult();
//这个调用只是映射字段,没有数据库交互
Map locationNameMap=metadataService.getKwebLocations(locationList,null);
对于(Map.Entry:locationNameMap.entrySet()){
entry.getValue().setMetadata(元数据);
metadata.getGeoLocations().add(entry.getValue());//失败
}
保存(元数据、用户名);
}
}捕获(例外e){
e、 printStackTrace();
返回;
}
调用processQueueMessages的方法/类具有@Scheduled注释。我尝试在调用者上添加@Transactional注释,但没有成功

我尝试了几种放置注释的方法,但总是出现以下错误: org.hibernate.LazyInitializationException:未能延迟初始化角色集合:.domain.Metadata.geologies,无法初始化代理-无会话

我无法在元数据域对象的定义中执行即时获取,因为它在许多我们不希望即时加载的地方被使用


我愿意接受建议。

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


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

从metadataRepository检索后,
元数据
对象似乎已经退出了事务会话,否则就没有必要抛出延迟异常。检查
metadataRepository.findOneById(uuid)
是否未在单独的事务中运行,例如将其标记为


为了防止延迟加载异常,您应该将调用中的数据预加载到metadataRepository.findOneById中,方法是简单地调用
metadata.getGeoLocations().isEmpty()
,或者使用查询急切地检索数据。经过大量搜索后,答案非常简单,通常是这样的。我使用一个配置类,它需要一个 @启用事务管理

答案在spring数据文档中


我一定已经读了十几遍了,但是没有读到关键语句。

根据您使用的版本,您可能可以使用实体图来加载此查询的对象。我也有同样的问题。特定版本中是否存在缺陷?自JPA 2.1以来,实体图一直受支持