10

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

到目前为止,谢谢!

4

3 回答 3

3

Hibernate 当前推荐的管理会话的方法在这个wiki 页面上有详细说明。特别是,我认为你需要阅读最后一段:这一切都非常困难,这不能做得更容易吗?

最后,您确实需要告诉持久层“我即将做某事”(通常也会让 Session 来做)和“我已经做完了”。您可以使用注解JTA 事务来完成,但这些信息仍然必须传达!

于 2012-04-24T13:15:50.173 回答
1

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

然后你的代码应该是这样的..

sessionFactory.getCurrentSession().save(newInstance); 
于 2012-04-24T09:56:58.580 回答
0

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

于 2012-04-24T08:56:27.037 回答