【问题标题】:nHibernate Many-To-Many mapping and Lazy loadingnHibernate 多对多映射和延迟加载
【发布时间】:2011-06-12 04:48:02
【问题描述】:

我的 Web 应用程序中的多对多关联和 nHibernate 中的会话存在问题。

我正在使用的对象始终保持与会话的连接,尽管往返于服务器。从来没有问题。到现在。我在课堂上添加了一个新的多对多关联。

这里是多对多映射(更改名称以使其更有意义):

 <bag name="ProductsToCategory" table="Tab_ProductsToCategory"" cascade="all-delete-orphan">
      <key column="ProductID" />
      <many-to-many class="CategoryClass" column="CategoryID" />
 </bag>

当我运行代码时,它会在初始负载上运行。然而,随后对访问此对象的服务器的调用(该对象在 Web 会话中维护)会导致此集合被破坏并引发此错误:

未能延迟初始化 收集,没有会话或会话 关闭

奇怪。我想知道是否存在导致问题的多对多关联?这个多对多只添加到这个类,而不是映射另一端的类,“CategoryClass”,因为我不需要它。 在我添加此映射之前,对象似乎没问题。

有什么想法吗?

还:我尝试简单地检查对象是否不再在会话中。它不是。所以我打电话给:session.refresh(productClass),一切都会正确更新,包括我麻烦的映射。然而。它会两次加载集合中的每个项目!该集合的项目数量是数据库中项目的两倍,每个项目出现两次。如果我能得到这个问题的答案,那么前一个问题并不重要。

如果您需要任何其他信息,请告诉我。干杯。

【问题讨论】:

    标签: nhibernate session nhibernate-mapping many-to-many lazy-loading


    【解决方案1】:

    我假设您在 Web 应用程序中使用 session-per-request 模式。延迟加载要求最初用于加载父对象的会话在访问其子集合时仍处于打开状态。您正在为每个 HTTP 请求创建一个新会话,因此在第一个请求中存储在会话状态中的对象在第二个请求中是分离的对象。这就是为什么您收到错误以及为什么原始对象不在第二个请求的会话中的原因。

    要修复它,请在从会话状态访问对象时调用 ISession.Lock。

    var myProductClass = GetProductClassFromSession(); // whatever method you use to do this
    session.Lock(myProductClass, LockMode.None);
    

    这应该可以解决您的问题,但更好的方法可能是使用 NHibernate 的二级缓存功能而不是会话状态。

    顺便说一句,您可能不希望在多对多映射中使用cascade="all-delete-orphan"。这将导致在删除 Product 时删除 Category 对象。

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多