编写hibernate函数的正确方法

时间:2012-06-30 20:25:30

标签: java hibernate

我在我的项目中使用hibernate并且它很顺利,但我的问题是我有点困惑,这是我正在编写hibernate函数的好方法。下面我粘贴我的代码块,以了解我如何编写hibernate函数,请检查它,并告诉我,这是一个正确的方法。这是我的块代码结构

SessionFactory sessionFactory = 
                (SessionFactory) ServletActionContext.getServletContext().getAttribute(HibernateListener.KEY_NAME);
        Session hibernatesession = sessionFactory.openSession();
        try {
            hibernatesession.beginTransaction();
            // my database access will be here
            hibernatesession.getTransaction().commit();
            hibernatesession.flush();
            }
        catch(Exception e){
          hibernatesession.getTransaction().rollback();
          e.printStackTrace();
        }finally{
          hibernatesession.close();
        }

这是我为所有dao类函数创建的结构,但现在我的网站加载速度非常慢。所以我的问题是我使用的狭窄是正确的。以上代码是否导致一次打开多个会话休眠。

2 个答案:

答案 0 :(得分:1)

flush()之后的commit()无效。

您真的需要打开一个新会话,然后为每个操作关闭它吗?

您可以使用sessionFactory.getCurrentSession()Hibernatesession.disconnect()

答案 1 :(得分:1)

在DAO类中进行事务管理并不是一件好事。我会热烈推荐使用Spring及其声明式事务管理,这是一个轻而易举的设置和使用的简单。如果你无法获得,那么你至少应该做一个穷人的替代方案。一个建议是使每个DAO成为一个类的子类,该类具有执行样板部件的方法(会话打开/关闭,事务开始/提交)并调用可覆盖的方法来执行实际工作。这将为您的方案实现 Template 模式。这是一个大纲:

public abstract class DaoTemplate
{
  public void execute() {
    final Session s = ((SessionFactory) ServletActionContext.getServletContext()
        .getAttribute(HibernateListener.KEY_NAME)).openSession();
    try {
      s.beginTransaction();
      doTheRealStuff();
      s.getTransaction().commit();
    }
    catch(Exception e) {
      s.getTransaction().rollback();
      e.printStackTrace();
    } finally { s.close(); }
  }

  protected abstract void doTheRealStuff();
}

另一个建议,以及十年前我在项目中实际使用的一个建议是实现策略模式。在这种情况下,您将对象传递给实现方法execute的{​​{1}}。此外,在这种情况下,doTheRealStuff类可以是单例(然后该类的名称也是合适的。)