每个会话的 Nhibernate 会话示例

2024-05-03

您好,nhibernate 的一些专业人士能给我每个会话的 Nhibernate 会话实现示例还是 unhaddins 实现吗? 或者解释如何做到这一点。 此致 恩迪斯


我使用 NHibernate 工作了 4 年。此前我曾与“每次操作打开会话”反模式 http://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch02.html%20#%20session-per-operation。这些物体总是分离的。因此,为了坚持下去,我必须重新附加它们或将它们的值复制到附加的对象。这会导致许多行代码和许多“延迟初始化异常”。

最近,我研究了「对话模式」 http://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch02.html-long%20conversations我做了一个实现”春网 http://www.springframework.net/“基础设施。实施已提交给“jira.springsource” https://jira.springsource.org at the 问题 SPRNET-1431(“对话范围”和“每次对话会话”的解决方法) https://jira.springsource.org/browse/SPRNET-1431.

我没有制作“示例应用程序”,但如果您有兴趣,我可以这样做。

Hailton

补充回答:

我准备了示例应用程序并发布在SPRNET-1431“对话范围”和“每次对话会话”的解决方法 https://jira.springsource.org/browse/SPRNET-1431作为文件“Spring.Conversation.example.7z”。

下面,我写了一些解释来澄清(或澄清)我所做的事情。

该“示例应用程序”是对“Spring.NET”版本“1.3.0”中包含的“Spring.Data.NHibernate.Northwind”的修改,以使用Conversation。 目前,“Spring.Net”没有“会话范围”,也没有实现“扩展持久上下文”(“每个会话策略一个会话”)的概念。

在此示例应用程序中,目标是演示:

  1. 如何将对象实例保持在“对话范围”的模仿中。显示于expression="@(convCustomer)['CustomerEditController']".
  2. 如何享受“扩展持久性上下文”。 “延迟加载错误”不再发生,并且重复调用ISession.Get让“同一条记录”不会造成对数据库的多次访问,更有效地利用NHibernate的缓存。对“CustomerList.aspx”的修改证明了这一点。要验证 Conversation 的有效性,请注释“App_Code\ConversationPage.cs”行this.Conversation.StartResumeConversation();那么您将在单击“CustomerList.aspx”上的“+”按钮时看到错误“无法延迟初始化角色集合”。

重要提示:切勿在整个应用程序中使用单个会话(“HTTP 会话”的持续时间相同)。请记住,NHibernate 保留所有加载对象的缓存,如果会话保持很长时间,则该缓存往往会无限增长(限制是数据库记录的数量)。也就是说,每个对话应仅限于应用程序页面的一个子集,并且必须在与该子集交互结束时被丢弃(IConversationState.EndConversation())。建议:保留<property name="EndPaused" value="true"/>在“Spring.Conversation.Imple.WebConversationManager”中,因此当开始对话时,其他对话将被丢弃。

附加信息:单元测试(“Spring.Northwind.IntegrationTests.2008”)不起作用。但这没有问题,因为它与支持对话所做的更改无关,事实上它们甚至在此之前就已经导致了错误。

“Spring.Data.NHibernate.Northwind”中的更改列表:

  • Spring.Northwind.Web.References.2008
    • 添加到方案的链接以启用自动完成。
  • 网络配置

    • 模块,添加:

      <add 
        name="ConversationModule" 
        type="Spring.Conversation.HttpModule.ConversationModule, Spring.Conversation"/>  
      <add 
        name="ConversationModule" 
        type="Spring.Conversation.HttpModule.ConversationModule, Spring.Conversation"/>
      
    • 模块,已删除:

      <add 
        name="OpenSessionInView" 
        type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate21"/>
      
  • web.xml

    • 模块配置

      <!--Configuration for Spring HttpModule interceptor's-->
      <object 
         name="HttpApplicationConfigurer" 
         type="Spring.Context.Support.HttpApplicationConfigurer, Spring.Web">
        <property name="ModuleTemplates">
          <dictionary>
            <entry key="ConversationModule">
              <!-- this name must match the module name -->
              <object>
                <!-- 
                select "view source" in your browser on any page to 
                see the appended html comment
                -->
                <property name="ConversationManagerNameList">
                  <list element-type="string">
                    <value>conversationManager</value>
                  </list>
                </property>
              </object>
            </entry>
          </dictionary>
        </property>
      </object>
      
    • 对话管理器

      <!--Conversation Manager-->
      <object 
          name="conversationManager" 
          type="Spring.Conversation.Imple.WebConversationManager, Spring.Conversation" 
          scope="session">
        <property name="SessionFactory" ref="NHibernateSessionFactory"/>
        <property name="EndPaused" value="true"/>
      </object>
      
    • 客户对话

      <!--
       Conversation for 'CustomerEditor.aspx', 'CustomerList.aspx', 
       'CustomerOrders.aspx', 'CustomerView.aspx',  and 'FulfillmentResult.aspx'
      -->
      <!--
       Important: If the application had other parties
       ("management employees" for example), they should use another 
       conversation.
      -->
      <object 
          name="convCustomer" 
          type="Spring.Conversation.Imple.WebConversationSpringState, Spring.Conversation" 
          scope="session">
        <property name="Id" value="convCustomer"></property>
        <property name="TimeOut" value="0"></property>
        <property name="ConversationManager" ref="conversationManager"></property>
        <property name="SessionFactory" ref="NHibernateSessionFactory"/>
        <property name="DbProvider" ref="DbProvider"/>
        <!--
          Using workaround for 'conversation scope' to reference for 
          'CustomerEditController'. It is not as volatile as "request scope" 
          not as durable as the "session scope"
        -->
        <property name="['CustomerEditController']" ref="CustomerEditController"></property>
      </object>
      
    • 更改“CustomerEditController”范围,删除 [scope="session"] 并放置 [singleton="false"]:

      <object 
          name="CustomerEditController" 
          type="NHibernateCustomerEditController" 
          singleton="false">
        <constructor-arg name="sessionFactory" ref="NHibernateSessionFactory"/>
      </object>
      ...
      
    • 更改参考"CustomerEditController", 消除ref="CustomerEditController"并把expression="@(convCustomer)['CustomerEditController']"(模拟“对话范围”):

      <!--
        Using workaround for 'conversation scope' to reference for 
        'CustomerEditController'. It is not as volatile as "request scope" 
        not as durable as the "session scope"
      -->
      <object name="CustomerEditPage" abstract="true">
        <property 
          name="CustomerEditController" 
          expression="@(convCustomer)['CustomerEditController']"/>
        <property name="Conversation" ref="convCustomer"/>
      </object>
      
        <!--
          Using workaround for 'conversation scope' to reference for 
          'CustomerEditController'. It is not as volatile as "request scope" 
          not as durable as the "session scope"
        -->
        <object type="CustomerView.aspx">
          <property name="CustomerDao" ref="CustomerDao" />
          <property 
            name="CustomerEditController" 
            expression="@(convCustomer)['CustomerEditController']" />
          <property name="Conversation" ref="convCustomer"/>
          <property name="Results">
            <dictionary>
              <entry key="EditCustomer" value="redirect:CustomerEditor.aspx" />
              <entry key="CustomerList" value="redirect:CustomerList.aspx" />
            </dictionary>
          </property>
        </object>
        <!--
          Using workaround for 'conversation scope' to reference for 
          'CustomerEditController'. It is not as volatile as "request scope" 
          not as durable as the "session scope"
        -->
        <object type="FulfillmentResult.aspx">
          <property name="FulfillmentService" ref="FulfillmentService" />
          <property 
            name="CustomerEditController" 
            expression="@(convCustomer)['CustomerEditController']" />
          <property name="Conversation" ref="convCustomer"/>
          <property name="Results">
            <dictionary>
              <entry key="Back" value="redirect:CustomerOrders.aspx" />
            </dictionary>
          </property>
        </object>
        <object type="Default.aspx">
          <property name="Conversation" ref="convDefault"/>
          <property name="Results">
            <dictionary>
              <entry key="CustomerList" value="redirect:CustomerList.aspx" />
            </dictionary>
          </property>
        </object>
        <!--Conversation for 'Default.aspx'-->
        <!--
          "convDefault" will have only one functionality: trigger the release
          of other conversations when started (StartResumeConversation())
        -->
        <object
            name="convDefault" 
            type="Spring.Conversation.Imple.WebConversationSpringState, Spring.Conversation"
            scope="session">
          <property name="Id" value="convDefault"></property>
          <property name="TimeOut" value="0"></property>
          <property name="ConversationManager" ref="conversationManager"></property>
          <property name="SessionFactory" ref="NHibernateSessionFactory"/>
          <property name="DbProvider" ref="DbProvider"/>
        </object>
  • 添加了“ConversationPage.cs”。支持对话的基本页面。
  • CustomerList.aspx
    • 允许在同一页面上列出“订单”,而不会出现“延迟初始化错误”。所有对象都保持附加到 ISession (NHibernate)。
  • CustomerList.aspx.cs:
    • 添加属性IList<Customer> CustomersLoadedOncePerConvList。列表仅加载一次,每个对话仅搜索数据库一次。
    • 改变Page_InitializeControls供考虑CustomersLoadedOncePerConvList.
    • 方法BtnShowOrders_Click隐式地执行“延迟加载”Customer.Orders.
  • Change ??? : Spring.Web.UI.Page to ??? : Spring.Web.UI.Page on:
    • 客户编辑器.aspx.cs
    • 客户列表.aspx.cs
    • 客户订单.aspx.cs
    • 客户视图.aspx.cs
    • FullfillmentResult.aspx.cs
    • 默认.aspx.cs
  • Dao.xml

    • Added <entry key="connection.release_mode" value="on_close"/>以避免每次执行 IDbCommand 之前和之后断开连接和重新连接。这很重要,因为事务边界之外可能会发生大量延迟加载。
    • Added:

      ...
      <entry key="show_sql" value="true"/>
      <entry key="format_sql" value="true"/>
      ...
      
  • 从“Default.aspx.cs”中删除(它们从未使用过):

    • customerDao;
    • fulfillmentService;
    • CustomerDao;
    • Button1_Click(object sender, EventArgs e);
    • ProcessCustomer();
  • 配置\Log4Net.xml。

    ...
    <!--detail's about SQL's. To view sql commands on Logs\log.txt-->
    <logger name="NHibernate.SQL">
      <level value="DEBUG" />
    </logger>
    ...
    <!--detail's about Conversation-->
    <logger name="Spring.Conversation">
      <level value="DEBUG" />
    </logger>
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个会话的 Nhibernate 会话示例 的相关文章

随机推荐

  • 如何使用 IPython 的事后 %debug 启动 pudb?

    I just 开始了 https documen tician de pudb starting html using breakpoint and pudb 这太棒了 现在我该如何制作 IPython debug神奇的启动pudb 注 p
  • 领域对象返回 nil (Swift)

    我有一个自定义多边形对象 因此我可以将地图叠加保存到领域 我能够成功创建这个对象 但是当我想检索 var 多边形对象时 它返回 nil 当我打印多边形对象时 它可以很好地打印出所有数据 这是打印内容的示例 CustomPolygon nam
  • 通过 MailChimp 发送电子邮件

    我认为问题出在附近 api gt listSubscribers include libs mailchimp MCAPI class php options array list id gt list id subject gt Prov
  • 如何等待在react.js中渲染视图直到$.get()完成?

    您好 我正在用 Reactjs 编写一个聊天客户端 并希望使用从 REST 调用检索到的数据来渲染我的组件 但是 我的组件是在 REST 请求返回数据之前渲染的 当我在我的子组件中调用 this props 时 这会导致错误 var Mai
  • 内部没有图像的链接的 jQuery 选择器

    我绑定一个click链接功能 body on click a function do something 现在我正在寻找一个仅在链接不包含图像标签时才匹配的选择器 有点类似于a not img but img是子元素 我怎样才能做到这一点
  • 修复 Vanilla JS Accordion 以一次展开一个选项卡

    我有这个手风琴工作 但是 我试图弄清楚如何一次仅展开一个 单击另一个选项卡 另一个选项卡关闭 我尝试了不同的方法来删除该类 但没有得到预期的结果 我也一直在尝试重构for循环到 ES6 标准 但这不是一个问题 样式是 Sass 因此在 JS
  • 从文本文件加载数据然后将其存储到数据库的最快方法

    我有问题 我正在开发一个项目 但我陷入了这一部分 我想从文本文件加载数据并将其存储到数据库访问中 things 是每个文本文件内的数据 大约 12 000 行数据 每个文本文件大约需要 10 分钟来处理 注意 在存储数据之前 我将文本文件中
  • WSo2 EMM - 应用程序管理数据库错误

    运行 WSo2 EMM 1 1 0 除了一个大问题外 一切都工作正常 从我第一次单击 应用程序管理 选项卡中的应用程序那一刻起 只要服务器正在运行 WSO2EMM DB h2 db 文件就会开始稳定增长 即使完全没有任何更改 最终 它变得如
  • PL/pgSQL 中“$$”的用途是什么

    对于 PL pgSQL 来说是全新的 双美元符号的含义是什么这个功能 http postgres cz wiki PL pgSQL 28en 29 CREATE OR REPLACE FUNCTION check phone number
  • 何时对 xmlns 使用 URN

    对于 hello world 类型的 xml 文档
  • 如何在引导程序中将边框半径应用于?

    我需要一行应该是圆角的 并且行与行之间有间距 到目前为止 我尝试了如下所示的表格 曲线类 任何建议 修改都会有帮助 My CSS table curved border collapse separate table curved bord
  • 如何等待所有请求完成

    我用的是宁AsyncHttpClient从命令行程序 我需要等待所有请求结束 以便我可以安全地拨打电话close 在客户端上 挑战在于我从该计划的许多不同部分提出了许多请求 下面剥离了自己的代码 显示了我从以下位置执行嵌套 HTTP 请求的
  • 如何使PHP库松耦合? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • BasicNetwork.performRequest:意外响应代码 500

    我的 Android Studio 中有这个登录 Java 代码 private void loginUser pd ProgressDialog show LoginActivity this Loading StringRequest
  • 将 jQuery 与托管在 Github 页面上的 Jekyll 站点结合使用

    我有一个简单的 Jekyll 博客托管在 github 页面上 我已经包含了 jQuery 和 tablesorter 插件 但遇到了错误 据我所知 这个错误是由于没有以正确的顺序加载 jQuery 引起的 我的下图显示代码的顺序是正确的
  • 在数据库中存储多维数组:关系数组还是多维数组?

    我读过很多类似的帖子多维到单维 多维数据库等等 但没有一个答案有帮助 我确实在谷歌上找到了很多文档 但只提供了背景信息 并没有回答手头的问题 我有很多彼此相关的字符串 PHP 脚本中需要它们 结构是分层的 这是一个例子 A AA AAA A
  • 使用 React 组件内的 标签进行锚定导航

    我正在尝试在我的反应应用程序内的页面组件之一中设置锚点导航 我正在尝试模仿所看到的相同功能在 Draft js 上 https draftjs org docs getting started installation它使用子标题作为锚点
  • 子进程c的返回值

    我需要帮助将 状态代码 从子程序返回给父程序 它将检查状态代码 打印代码并退出父程序 这是一个班级项目 所以我会在这里放置一些相关代码 但出于明显的原因 我不会发布整个项目 我已经通过 exec 分叉并创建了子进程 父进程进行一些奇特的数学
  • 当用户关闭 IE 时显示消息框

    当用户关闭 IE 时 是否有 JavaScript 提示消息框 我尝试寻找代码示例很长一段时间但失败了 提前致谢 乔治 这是我的 html 代码 但有以下错误 有任何想法吗 为了帮助保护您的安全 Internet Explorer 已限制此
  • 每个会话的 Nhibernate 会话示例

    您好 nhibernate 的一些专业人士能给我每个会话的 Nhibernate 会话实现示例还是 unhaddins 实现吗 或者解释如何做到这一点 此致 恩迪斯 我使用 NHibernate 工作了 4 年 此前我曾与 每次操作打开会话