当前位置: 首页 > 面试题库 >

为每个请求创建休眠会话

吴和硕
2023-03-14
问题内容

我刚刚启动了一个简单的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。

到此为止!


问题答案:

该Wiki页面上详细介绍了Hibernate当前推荐的用于管理Session的方法。特别是,我认为您需要阅读最后一段:这都是非常困难的,难道这样做不容易吗?

最后,您确实需要告诉持久层“我将要做某事”(通常也可以让Session完成此工作)和“我已经完成了”。您可以使用批注或JTA事务来完成此操作,但仍必须传达该信息!



 类似资料:
  • 我有一个遗留的Java1.6运行localhostTomcat 7应用程序使用JSP页面,一个带有框架的框架集,javascript,但没有像Struts这样的框架。我使用请求或会话从servlet传递一个对象以在页面中显示,这很好。 然而,我最近做了一些更改,现在我无法从会话或请求中检索到相同的对象。它以前工作得很好,所以我不确定是什么坏了,但我甚至无法将字符串值从JSP返回到servlet。

  • 问题内容: 我有一个实体- 。由描述。 Hibernate为每个实体创建一个表,因此当我调用时,我的数据总是保存到该表中。 现在,我需要另一个表来存储相同类型的数据,并且只需要将我的实体保存到该表中。 数据结构 (类似这样): 使用此方法 : 和结果,我应该在和 中。 由于系统限制,我无法将这两个对象放在一个表中。(即使创建额外的字段也是个坏主意)。 我可以不进行子类化吗?使用Programmat

  • 问题内容: 我有登录功能 此函数用于将变量保存到会话中, 但是当新请求检查用户是否登录时 然后返回总是“注销”,因为会话已更改。我使用Redis来存储会话,我认为这是Redis的错误,因为当我停止使用Redis时,可以,请帮帮我! 问题答案: 最好的处理方式是始终让Express处理它(如果可以的话)。 https://flaviocopes.com/express-sessions/(更新了会话

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它

  • 我有一个类,下面的类作为RequestScope bean:

  • 问题内容: 我在hibernate和延迟加载方面遇到问题。 背景:我有一个Spring MVC Web应用程序,我将Hibernate用于持久层。我正在使用OpenSessionInViewFilter使我能够在视图层中延迟加载实体。我正在扩展HibernateDaoSupport类,并使用HibernateTemplate保存/加载对象。一切都进行得很好。直至现在。 问题:我有一个可以通过Web