Java 编写hibernate函数的正确方法
我在我的项目中使用了hibernate,它进展顺利,但我的问题是我有点困惑,我正在使用编写hibernate函数的好方法。下面我将粘贴我的代码块,以了解我是如何编写hibernate函数的。请检查并告诉我这是一个正确的方法。这是我的块代码结构Java 编写hibernate函数的正确方法,java,hibernate,Java,Hibernate,我在我的项目中使用了hibernate,它进展顺利,但我的问题是我有点困惑,我正在使用编写hibernate函数的好方法。下面我将粘贴我的代码块,以了解我是如何编写hibernate函数的。请检查并告诉我这是一个正确的方法。这是我的块代码结构 SessionFactory sessionFactory = (SessionFactory) ServletActionContext.getServletContext().getAttribute(Hibernat
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
类可以是一个单例(因此,该类可以使用不同的名称)