Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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 - Fatal编程技术网

Java 编写hibernate函数的正确方法

Java 编写hibernate函数的正确方法,java,hibernate,Java,Hibernate,我在我的项目中使用了hibernate,它进展顺利,但我的问题是我有点困惑,我正在使用编写hibernate函数的好方法。下面我将粘贴我的代码块,以了解我是如何编写hibernate函数的。请检查并告诉我这是一个正确的方法。这是我的块代码结构 SessionFactory sessionFactory = (SessionFactory) ServletActionContext.getServletContext().getAttribute(Hibernat

我在我的项目中使用了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类函数创建的结构,但现在我的网站加载速度非常慢。所以我的问题是,我所使用的限制是正确的。是上述代码导致一次打开多个会话休眠

提交()之后的
flush()
无效

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


您可以使用
sessionFactory.getCurrentSession()
Hibernatesession.disconnect()
在DAO类中进行事务管理不是一个好的设计。我强烈推荐使用Spring及其声明式事务管理,这是一个容易设置的、不用动脑筋就能使用的工具。如果你无法做到这一点,那么你至少应该让穷人做出选择。一个建议是使每个DAO成为一个类的子类,该类有一个方法来完成样板文件部分(会话打开/关闭、事务开始/提交),并调用一个可重写的方法来完成实际工作。这将为您的场景实现模板模式。这是一个提纲:

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();
}
另一个建议,也是我十年前在一个项目中实际使用的,是实施战略模式。在这种情况下,您需要将一个对象传递给实现方法
doTheRealStuff
execute
。另外,在这种情况下,
DaoTemplate
类可以是一个单例(因此,该类可以使用不同的名称)