【问题标题】:Questions about nhibernate关于休眠的问题
【发布时间】:2011-01-17 03:06:23
【问题描述】:

我有几个关于 nhibernate 的问题。

  1. 我仍然不明白上下文会话的含义。我做网络东西,所以我只选择“网络”,但我真的不知道它在做什么。

  2. 我应该将 session.BeginTransaction() 放在 Application_BeginRequest 中吗?

  3. 我应该提交 Application_EndRequest 中的所有内容吗?或者我应该在需要时提交。假设我需要插入一个用户,然后在一些代码中稍后我需要更新其他一些表。我应该让用户进行更新然后最终提交还是应该等到两者都准备好提交?

  4. 是否应该始终在 Application_EndRequest 中使用 session.Rollback()?

  5. 我应该在 Application_EndRequest 中使用 session.close() 或 session.dispose() 还是两者兼而有之?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:
    1. “web”上下文意味着每个SessionFactory 每个HttpContext(即每个请求)只能有一个“当前”Session。绑定/解除绑定是您的责任。

    2. 不用太深入,我会说这很好,只要您想将 1 个请求 == 1 个事务等同起来。

    3. 记住会话是一个工作单元。虽然您可以在一个请求中处理多个事务,但这并不常见,所以我认为您应该提交 EndRequest,除非出现错误(与您的第二个问题保持一致)

    4. 不一定。如果出现错误,您可以调用它,尽管处理它会产生相同的效果。

    5. 丢弃就够了。

    【讨论】:

      【解决方案2】:

      有关上下文会话的信息,请查看此link

      至于您的其他问题,它们都是相关的。 Hibernate 事务应该是原子的,但此外,事务及其会话的范围应该限于一个工作单元。换句话说,您应该在需要持久化或检索某些内容时打开一个会话,并在完成后关闭它。

      一般来说,最好将 Hibernate 的 DAO 设计模式与某种会话管理器结合使用,从而为您提供单例会话。

      我强烈建议阅读 this article 关于 Hibernate 会话和事务的内容。它更深入地解释了我刚才谈到的内容,并讨论了如何实现 DAO 模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 2012-09-17
        • 2011-03-16
        • 1970-01-01
        相关资源
        最近更新 更多