无法初始化代理 - 没有会话和懒惰对象

时间:2017-11-07 08:07:58

标签: java hibernate

could not initialize proxy - no Session错误是什么意思?什么意思的懒惰对象和为什么会发生??,以及如何避免它而不更改hibernate laze属性并且不使用Hibernate.initialize(),因为这对我不起作用。

2 个答案:

答案 0 :(得分:0)

您应该使用注释@Transactional

标记您的方法
@Transactional
void method(){
    Entity e = ... (from database);
    e.getLazyField();
}

答案 1 :(得分:0)

这里有几件事,首先你似乎在问“什么是延迟加载”。

如果您要从数据库加载与另一个对象有关系的对象,则延迟加载只允许您加载所需的对象,并且只在您需要时加载相关对象。

您遇到的异常是在对象与数据库会话断开连接后尝试访问相关对象引起的(显然需要db会话来加载它们)。

我们可以通过几种方式处理这种情况,最合适的方式完全取决于您的申请。

你总是可以在首次加载对象的事务中加载你需要的所有数据(Hibernate.initialise,或者有时只是调用getter会工作),这将删除你的异常:这样做的缺点是发现你经常引导大量数据并且可能存在性能问题

另一种方法是将Id传递到您需要使用该对象的位置,从数据库加载一个新的并在事务中完成您的工作,传递ID不是很多OO但有时它是最佳选择。 / p>

例如,如果您在UI绑定或其他只想“获取”的地方出现此错误,您可能需要考虑“视图中的会话”,它将为您的延迟加载提供数据库会话。

如果不了解您的应用程序及其架构,我无法告诉您什么是最佳选择。

如果您想进一步讨论这个问题,请告诉我。