Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为每个请求创建Hibernate会话_Java_Hibernate_Jetty_Design Patterns_Resteasy - Fatal编程技术网

Java 为每个请求创建Hibernate会话

Java 为每个请求创建Hibernate会话,java,hibernate,jetty,design-patterns,resteasy,Java,Hibernate,Jetty,Design Patterns,Resteasy,我刚刚启动了一个简单的Java测试项目,它使用Hibernate管理一些实体,并提供一个REST接口来操作这些对象,并提供一些额外的业务逻辑。REST接口是使用RESTEasy和Jetty创建的 到目前为止,一切都很好,但我觉得我实际上编写了太多的样板代码。由于我在这些Java框架方面没有太多经验,我想知道是否有人能给我一个如何改进这种情况的提示 为每个请求创建休眠会话 嗯,据我所知,我必须为每个请求创建一个Hibernate会话,最后我必须关闭它。所以目前我所有的服务方法都是这样的: Sess

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

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

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

    Session session = HibernateUtil.getInstance().getSessionFactory().openSession();
    ...
    ...
    ...
    session.close();
    
    有没有办法删除这两行以便自动执行此操作? 目前我的服务注册为RestEASY singleton。更改为RESTeasy ressource并在构造函数中创建会话会解决问题吗?我认为这将解决创建会话的问题。但是在哪里关闭它呢

    在C++中,创建一个关闭对象的对象,可以在结束时关闭会话。但是在爪哇

  • 每当发出这样的REST请求时,我都必须检查有效的会话(用户必须事先登录)。ServletFilter是这样做的正确方法吗
  • P>一般:还有其他的模式或框架我应该考虑使用吗?我的意思是我想让它尽可能简单,尤其是因为我没有那么多经验,我不想最终使用Spring或任何重量级框架。看起来我已经习惯了Python和Django的简单性,但是对于这个小项目,我必须使用Java


    谢谢你

    您应该尝试编写一个过滤器来实现这一点。如果需要示例,Spring的OpenSessionInViewFilter是一个很好的起点。

    将SessionFactory注入数据访问对象,并使用SessionFactory.getCurrentSession()访问Hibernate会话对象。 您可以使用任何可用的Factory类来实现此功能

    那么您的代码应该是这样的

    sessionFactory.getCurrentSession().save(newInstance); 
    

    Hibernate目前推荐的会话管理方法详细介绍了这一点。特别是,我认为你需要阅读最后一段:


    最后,您确实需要告诉持久化层“我将要做某事”(这通常也会让会话来做)和“我已经做了”。你可以用,或者,但是这些信息仍然需要交流

    好的,但是我在哪里关闭会话呢?在struts2的情况下,你可以使用拦截器初始化和关闭会话对象。