当前位置: 首页 > 知识库问答 >
问题:

如何在我的Spring 4/Hibernate 4项目中替换HibernateTemplate和HibernateCallback?

太叔昊穹
2023-03-14

我正在开发一个非常大、旧的spring3冬眠3项目,我的任务是将其升级到spring4冬眠4。

显然,HibernateTemplate在hibernate4中不再受支持,所以当我升级时,我们的客户端代码会中断。

我们所有的DAO都扩展了HibernateDaoSupport。许多DAO代码如下:

public class ManagerDaoImpl extends HibernateDaoSupport implements ManagerDAO {

public List<Person> getManagers() {
    List l = (List) this.getHibernateTemplate().executeFind(new HibernateCallback(){
        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            List result = (List) session.createQuery(MySqlQueryString).list();
            return result;
        }
    });
    return l;
}

//........

}

它以XML连接,如下所示:

<bean id="managerDaoImpl" class="com.foo.bar.hibernate.ManagerDaoImpl">
    <property name="sessionFactory" ref="MySessionFactory" />
</bean>

<bean id="MySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource"     ref="myDataSource" />
    <property name="configLocation" value="WEB-INF/hibernate.cfg.xml" />
</bean>

我认为我需要做的是:

public List<Person> getManagers() {}
            List result = (List) getSessionFactory().getCurrentSession.createQuery(MySqlQueryString).list();
            return result;
    return l;
}

但这给了我一个错误,如:

Property 'sessionFactory' threw exception; nested exception is org.hibernate.HibernateException: No Session found for current thread

我做错了什么?

我认为hibernateTemplate被弃用的全部意义在于Spring 3可以为我处理交易?

我真的不认为升级这种常用技术的“阻力最小的路径”方法会涉及到像会话会话和事务范围这样的事情。

共有3个答案

黄凌龙
2023-03-14

你通读了Spring交易管理吗?

http://docs . spring . io/spring/docs/current/spring-framework-reference/html/transaction . html" target="_blank">html

您可以连接一个全局txn拦截器,然后用@Transactional标记您的业务/服务方法(DAO级别可能太低)。LMK,如果您需要详细信息。干杯。

编辑:回应保罗的评论(将其烘焙成答案,因为它太长了,无法发表评论)。

@Transactional应该在方法级别使用,但以我的经验来看,DAO太低级了。明确地说,单个概念操作可以涉及多个DAO级别的操作,事务边界在业务操作级别而不是DAO级别的优势是,您可以获得更一致的状态,因为否则部分业务操作可能会失败,但其他部分已经提交。

阎祖鹤
2023-03-14

(一旦你配置了一切...)
Hibernate辅助支持由您的类“管理器辅助”扩展,它具有受保护的方法 currentSession()。

public List<Person> getManagers() {}
            List result = (List) currentSession.createQuery(MySqlQueryString).list();
            return result;
    return l;
}
杨慎之
2023-03-14

正如泰勒所说,您需要配置事务。

有关更多详细信息,请参阅以下帖子:

1) Spring和hibernate:未找到当前线程的会话

2)Spring Hibernate:当前线程找不到会话,它说:

sessionFactory需要事务才能工作,要解决它,请在Spring中声明一个事务管理器。

 类似资料:
  • org.springframework.beans.factory.beanCreationException:创建名为“student controller”的bean时出错:注入autowired依赖项失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连接字段:public edu.java.spring.d

  • 所以发生的事情是,我从这个项目的一开始就开始研究智能IDEA。由于提交要求,我不得不将项目转换为Eclipse兼容形式。所以我把它转换成了日食计划。在那之后,我注意到我不能像以前那样真正地做这个项目。这是我在将我的项目转换为Eclipse兼容后看到的。我想撤消它。但我不知道该怎么做。

  • 我需要用替换当前项目中的所有文件中的……有什么简单的方法可以做到这一点?(搜索导航器中只有搜索)。 另外,我需要在所有.m文件的开头添加一行。这是如何快速完成的?(这样的文件有500多个。)

  • 我有一个pycharm项目,大概还有一个Django项目。也许它们是一回事,也许不是——我不确定区别。 总之,在我的settings.py文件中(该文件位于< code>project目录的根目录下,我认为这是我的pycharm项目),我有: 这是否意味着< code>dumpstown是我的项目名称?还是我的pycharm项目名?有什么区别?因为我还有一个名为< code>dumpstownap

  • 我单击ctrl-R并单击replaceAll按钮,但它只在当前文件中更改。 任何想法如何做同样的,但在整个项目。