我使用get
方法检索实体的数据。会话关闭时,由于启用了延迟加载,因此某些属性是代理
在程序的稍后阶段,我想要检索这些代理属性。那我该怎么办?每次我想要获取代理属性时是否应该打开会话?如果是这种情况,我怎么告诉会话内的hibernate?我知道我首先需要将实例重新附加到新会话中我不知道下一步该做什么。
答案 0 :(得分:0)
是的,初始化代理需要一个会话。
您应该做的是避免在所有工作完成之前关闭会话。如果您正在开发webforms(asp.net)应用程序,我建议您实现每个请求的会话。也就是说,您应该为每个Web请求创建一个会话,然后在请求结束时关闭它。通过这样做,您可以确保您的会话对于需要完成的任何数据库工作保持打开状态。您可以在this answer中找到每个请求的会话的实现详细信息。
如果您正在使用Windows应用程序(例如Winforms),那么您应该考虑为每个表单打开一个会话,这类似于上面的每个请求会话方法。在Form_Load期间打开一个会话,并在Form_Close中关闭它。
官方的NHIbernate手册也在Topic 19.1.4: Initializing collections and proxies中讨论了这个问题。