【发布时间】:2017-06-11 00:34:24
【问题描述】:
我有以下代码:
public void method1(String id){
Object object = repository.findOne(id);
object.setState("running");
repository.save(object);
try{
object2.method2(object); //This method takes 2 hours to complete
object.setState("complete");
}catch(Exception e){
object.setState("failed");
}
repository.save(object);
}
因此,在调用需要数小时才能执行的方法之前,我将状态更改为“正在运行”。我的对象是 JPA Entity(带有延迟加载的集合),method2() 尝试加载所有链接的 entities。
现在,在method2,我得到了
无法初始化代理 - 没有会话
错误,因为它在事务之外(预期行为)。为了防止这种情况,有两种解决方案:
- 用
@Transactional注释method1。这可以解决它,但是在方法执行完成之前,state不会反映到其他事务中。 - 更改实体配置中的
fetch mode并将其设为Eager。这也可以解决它,但我不希望每次都获取eager。
还有其他方法可以让它工作吗?
【问题讨论】:
-
抱歉,您有多少数据,加载链接实体需要两个小时听起来很疯狂。不加载它们就不能在数据库中操作这些实体吗?
-
method2实际上不执行任何更新或删除操作。它所做的只是read,所以也许更简单的选择是将实体转换为Dto并将其发送到method2。 -
如果不操作数据,为什么还要加载数据。如果您正在根据实体操作其他内容,则可以选择您需要的数据而不是所有链接的实体。通常像这样长的加载时间表明滥用了急切加载或其他一些概念错误。在下面检查我的答案。
标签: java spring orm spring-data-jpa spring-transactions