我正在开发一个非常大、旧的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可以为我处理交易?
我真的不认为升级这种常用技术的“阻力最小的路径”方法会涉及到像会话会话和事务范围这样的事情。
你通读了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级别的优势是,您可以获得更一致的状态,因为否则部分业务操作可能会失败,但其他部分已经提交。
(一旦你配置了一切...)
Hibernate辅助支持由您的类“管理器辅助”扩展,它具有受保护的方法 currentSession()。
public List<Person> getManagers() {}
List result = (List) currentSession.createQuery(MySqlQueryString).list();
return result;
return l;
}
正如泰勒所说,您需要配置事务。
有关更多详细信息,请参阅以下帖子:
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按钮,但它只在当前文件中更改。 任何想法如何做同样的,但在整个项目。