我在我的项目中使用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类函数创建的结构,但现在我的网站加载速度非常慢。所以我的问题是我使用的狭窄是正确的。以上代码是否导致一次打开多个会话休眠。
答案 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
类可以是单例(然后该类的名称也是合适的。)