【发布时间】:2015-11-18 08:09:23
【问题描述】:
我们已经使用 Spring 4、Hibernate、存储库和 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>
调用 processQueueMessages 的方法/类有一个@Scheduled 注解。我尝试在调用者上添加@Transactional 注释,但无济于事。
我尝试了几种放置注释的变体,但总是出现此错误: org.hibernate.LazyInitializationException:无法延迟初始化角色集合:.domain.Metadata.geoLocations,无法初始化代理 - 无会话
我不能在 Metadata 域对象的定义中进行 Eager fetch,因为它在很多我们不想进行 Eager 加载的地方使用。
我愿意接受建议。
【问题讨论】:
-
根据您使用的版本,您可能可以使用实体图为该查询急切加载对象。
-
我也有同样的问题。特定版本是否存在错误?
-
自 JPA 2.1 起支持实体图
标签: java hibernate jpa scheduled-tasks transactional