gpt4 book ai didi

java - 编写 hibernate 函数的正确方法

转载 作者:行者123 更新时间:2023-11-30 04:44:50 30 4
gpt4 key购买 nike

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

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 类函数创建的结构,但现在我的网站加载速度非常慢。所以我的问题是我使用的限制是正确的。上面的代码是否会导致同时打开多个 session hibernate 。

最佳答案

在 DAO 类中进行事务管理并不是一个好的设计。我强烈推荐使用 Spring 及其声明式事务管理,设置起来很简单,使用起来也很简单。如果你做不到,那么你至少应该做一个穷人的替代品。一个建议是让每个 DAO 成为一个类的子类,该类具有执行样板部分( session 打开/关闭、事务开始/提交)并调用可重写方法来完成实际工作的方法。这将为您的场景实现模板模式。这是一个大纲:

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 类可以是一个单例(那么该类的不同名称将是合适的)。

关于java - 编写 hibernate 函数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11277415/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com