根据请求创建Hibernate-Session

时间:2012-04-24 08:51:29

标签: java hibernate jetty design-patterns resteasy

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

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

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

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

    有没有办法删除这两行,以某种方式自动执行此操作? 目前我的服务已注册为RestEASY单身人士。是否会更改为RESTeasy ressource并在构造函数中创建会话来解决问题?我认为它将解决创建会话的问题。但是关闭呢?

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

    1. 每当发出这样的REST请求时,我都必须检查有效的会话(用户必须先登录)。 ServletFilter是正确的方法吗?
    2. 概述:我应该考虑使用其他任何模式或框架吗?我的意思是我想保持尽可能简单,特别是因为我没有那么多经验我不想最终使用Spring或任何重量级框架。似乎我已经习惯了Python和Django的简单性,但对于这个小项目,我必须使用Java。

      到目前为止,已经收到了谢谢!

3 个答案:

答案 0 :(得分:3)

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

最后,你需要告诉持久层“我即将做某事”(这通常也会让Session做到这一点)和“我做完了”。您可以使用annotationsJTA transactions执行该操作,但仍需要传达该信息!

答案 1 :(得分:1)

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

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

sessionFactory.getCurrentSession().save(newInstance); 

答案 2 :(得分:0)

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