【问题标题】:Create Hibernate-Session per Request根据请求创建 Hibernate-Session
【发布时间】:2012-04-24 08:51:28
【问题描述】:

我刚刚开始了一个简单的 Java 测试项目,它使用 Hibernate 管理一些实体,并提供一个 REST 接口来操作这些对象并提供一些额外的业务逻辑。 REST 接口是使用 RESTEasy 和 Jetty 创建的。

到目前为止一切正常,但我觉得我实际上编写了太多样板代码。由于我在这些 Java 框架方面没有太多经验,我只是想知道是否有人可以就如何改善这种情况给我一个提示。

  1. 为每个请求创建 Hibernate 会话

好吧,据我所知,我必须为每个请求创建一个 Hibernate 会话,最后我必须关闭它。所以目前我所有的服务方法都是这样的:

Session session = HibernateUtil.getInstance().getSessionFactory().openSession();
...
...
...
session.close();

有没有办法删除这两行以便自动执行此操作? 目前我的服务已注册为 RestEASY 单例。更改为 RESTeasy 资源并在构造函数中创建会话会解决问题吗?我认为它将解决创建会话的问题。但是在哪里关闭呢?

在 C++ 中,这可以很容易地创建一个范围对象,该对象在最后关闭会话。但是在 Java 中呢?

  1. 每当发出这样的 REST 请求时,我都必须检查有效会话(用户必须事先登录)。 ServletFilter 是执行此操作的正确方法吗?

一般:我应该考虑使用任何其他模式或框架吗?我的意思是我想让它尽可能简单,特别是因为我没有那么多经验,我不想最终使用 Spring 或任何重量级框架。看来我已经习惯了 Python 和 Django 的简单性,但是对于这个小项目,我必须使用 Java。

到目前为止,谢谢!

【问题讨论】:

    标签: java hibernate jetty design-patterns resteasy


    【解决方案1】:

    wiki page 详细介绍了 Hibernate 当前推荐的管理会话的方法。特别是,我认为你需要阅读最后一段:This is all very difficult, can't this be done easier?

    最后,您确实需要告诉持久层“我即将做某事”(通常也会让 Session 来做这件事)和“我已经做完了”。您可以使用annotationsJTA transactions 进行操作,但这些信息仍然需要传达!

    【讨论】:

      【解决方案2】:

      将 SessionFactory 注入您的数据访问对象并使用 sessionFactory.getCurrentSession() 访问 Hibernate Session 对象。 您可以使用任何可用的工厂类来实现这一点..

      那么你的代码应该是这样的..

      sessionFactory.getCurrentSession().save(newInstance); 
      

      【讨论】:

      • 好的,但是在哪里关闭会话?
      • 在struts2的情况下,你可以使用拦截器来初始化和关闭会话对象。
      【解决方案3】:

      您应该尝试编写一个过滤器来执行此操作。如果您需要示例,Spring 的 OpenSessionInViewFilter 是一个很好的起点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多