NHIbernate+;MVC&x2B;春天具有HibernateTemplate(由Spring初始化)的动态对象(通过Activator.CreateInstance)强制延迟加载异常

NHIbernate+;MVC&x2B;春天具有HibernateTemplate(由Spring初始化)的动态对象(通过Activator.CreateInstance)强制延迟加载异常,spring,nhibernate,spring-mvc,Spring,Nhibernate,Spring Mvc,我的web应用程序的结构如下所示: 我有从BaseDAO继承的DAO类(每个特定实例)。(其中,T可能类似于“客户”)。 基类包含一个HibernateTemplate属性 我有一个MVC控制器的基类(带有继承的控制器) 我有一个用于服务的基类(M+V+C+服务模型)(每个实例都有继承的基类(如“CustomerService”)) 我有一个DAO类的基类(每个实例继承一个…(在另一个VS项目中分开) 我有POCO对象类(每个db表),映射(以及彼此之间的关系)在Hibernate的xml文件中

我的web应用程序的结构如下所示: 我有从
BaseDAO
继承的DAO类(每个特定实例)。(其中,
T
可能类似于“客户”)。 基类包含一个
HibernateTemplate
属性

我有一个MVC控制器的基类(带有继承的控制器)

我有一个用于服务的基类(M+V+C+服务模型)(每个实例都有继承的基类(如“CustomerService”))

我有一个DAO类的基类(每个实例继承一个…(在另一个VS项目中分开)

我有POCO对象类(每个db表),映射(以及彼此之间的关系)在Hibernate的xml文件中定义

当前正在运行的应用程序以以下方式管理所有内容(它的功能与以前的实现相同):

  • MVC控制器包含一些服务属性(这些属性是控制器工作所必需的),它们由Spring通过xml文件定义进行初始化。 (例如,
    UsersController
    可以具有
    UsersService
    UsersRoleService
    属性)

  • 每个服务都包含相应的DAO帮助器属性(例如,UsersService有UsersDAO属性),初始化也在xml文件中定义(对于Spring)

因此,一般来说(因为每个这样的初始化都是在xml文件中定义的),所有结构都是由Spring在页面生命周期开始时初始化的。一切都很顺利。 ... 除了开发过程的便利性 ... 因为我需要预先定义“无处不在的一切”,也就是说,如果我还需要在
UsersController
中有
UsersWarService
,那么我必须在
UsersController
中定义它的属性,然后转到xml文件并添加它的初始化。因此,这是非常不可信和不灵活的

我想做什么:

我创建了一个方法
GetService().GetAllUsers()
(只是一个示例) 它通过
Activator.CreateInstance
动态创建服务(它允许调用任何控制器中的任何服务,而无需任何预定义)。除了没有HibernateTemplate(=null)(因为它没有通过Spring“激活”)之外,一切都正常。因此,我尝试通过
Application.Current.Context
GetObject
获取该对象,以通过Spring+Hibernate获取HibernateTemplate

一切都开始工作了,但只是简单的请求

如果我尝试这样做:

GetService<UsersService>()
    .GetAllUsers()
    .Where(x => x.UsersEmailsAmount.Count > 0) 
GetService()
.GetAllUsers()
.Where(x=>x.UsersEmailsAmount.Count>0)
(使用子集合的延迟加载时)

。。。它收到以下异常:

“未能延迟初始化集合-没有会话或会话已关闭”

在所有这些之后,我甚至尝试将一些属性添加到Controller/Service/Dao(到基本类)(这将需要在XMLHibernate文件中只定义控制器),我甚至得到了HibernateTemplate属性的良好初始化,但在延迟加载操作中,我仍然有相同的异常

在这种动态加载的情况下,“某物”“某处”仍然没有初始化会话引用(即使我通过Spring获得HibernateTemplate对象),但我不知道“某物”和“某处”在哪里。我觉得所有这些东西都围绕着POCO对象运行,具有Hibernate的一些内部行为,但看不出所有这些东西是如何相互绑定的

有没有人能给我一些线索,哪怕是理论上有可能实现我想要的?(我相信在发展中可以做的一切,但问题是是否值得花时间)


我是新加入hibernate的,开发这个应用程序的人准备花这么多时间来解释所有这些定义,但这太不容易了,也不明显(甚至没有提到新开发人员(尤其是没有任何文档!))

有趣。开发人员似乎想在这个项目中同时使用所有很酷的东西

您需要调查的是nhibernate会话的生命周期

  • 什么时候开门
  • 什么时候关门
  • spring是否像ajax那样一次性或每页部分调用加载服务,从而可能影响会话
  • object createInstance是否让您的依赖关系更加清晰,或者您是否陷入了更深的泥潭
  • 是否存在任何输入和/或输出筛选器,这些筛选器是否打开或关闭,是否刷新会话

祝你好运。

经过一些探索,我发现在我的“动态创建的DAO”中,调用HibernateTemplate.SessionFactory.GetCurrentSession()会引发以下异常:

没有绑定到线程的Hibernate会话,配置不允许在此创建非事务会话。

我读过一些论坛,在某些情况下,他们建议只将定义的事务管理部分添加到配置文件中,或者为DAO方法添加一些属性,如“@Transactional”


但是有很多答案是正确的,但它们相对来说不是NHibernate(而是普通Java的答案)!因此,我仍然没有任何解决办法。

经过一些研究,我发现我正在尝试做的事情非常棘手(至少在我的项目情况下,因为我不允许做太多更改)。 对于任何试图“让我的梦想成真”(在他们的项目中)的人,我可以说,一切皆有可能。我认为可以实现的方法是编写自己的SessionContext类(可能继承自SpringSessionContext),并在当前的会话上下文类中定义该类,以便能够执行以下操作: CurrentSessionContext.Bind (咖喱)