会话断开连接时,延迟加载失败

时间:2010-02-17 20:13:52

标签: nhibernate

我们使用一个(只读)会话,一旦从数据库中检索数据,我们就会断开连接。检索到的数据通常具有延迟加载的属性,这些属性尚未初始化。

当我们尝试访问属性时,会抛出以下异常:

NHibernate.LazyInitializationException

初始化[NHibernateTest.AppUser#16] - 无法初始化角色集合:NHibernateTest.AppUser.Permissions,会话断开连接

有没有办法(拦截器)自动检测应用程序是否正在尝试访问未初始化的属性,以便拦截器可以快速打开连接并在工作单元后关闭它?

立即获取所有内容会使懒惰的使用无效。

1 个答案:

答案 0 :(得分:1)

没有有效的方法可以做到这一点。这个想法是你保持会话开放,直到完成会话。每个单位的工作应该有一个会话。 (会话实际上是一种工作单元)。

在一个查询中提取您需要的所有内容比在多个查询中获取您需要的所有内容更有效,因此我不同意您的上一个语句。延迟加载对于懒惰的程序员(比如我)很有用,但永远不会比急切加载更有效。延迟加载可以节省一些编程时间,但您仍需要注意正在执行的许多查询(选择N + 1)