我正在开发一个非常大的旧的spring3,hibernate3项目,我的任务是将它升级到spring4 hibernate4。
显然hibernate4不再支持HibernateTemplate,所以当我升级时,我们的客户端代码会中断。
我们所有的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+可以为我处理这些事务吗?
我真的不认为升级这种常用技术的“阻力最小”的方法会让我的手弄脏会话会话和交易范围。
答案 0 :(得分:1)
正如泰勒所说,你需要配置交易。
有关详细信息,请参阅以下帖子:
1)Spring and hibernate: No Session found for current thread
2)Spring + Hibernate : No Session found for current thread在哪里说:
sessionFactory需要事务工作,解决它,声明一个 春天的交易经理。
答案 1 :(得分:0)
(一旦配置完所有......)
由您的类ManagerDaoImpl扩展的HibernateDaoSupport具有受保护的方法currentSession()。所以你可以写
public List<Person> getManagers() {}
List result = (List) currentSession.createQuery(MySqlQueryString).list();
return result;
return l;
}
答案 2 :(得分:-1)
您是否阅读过春季交易管理?
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html
您可以连接全局txn拦截器,然后使用@Transactional标记您的业务/服务方法(DAO可能太低级别)。 LMK如果您需要详细信息。欢呼声。
修改强> 回应保罗的评论(将其烘焙成答案因为评论时间过长)。
@Transactional意味着在方法级别使用,但根据我的经验,DAO级别太低。需要明确的是,单个概念操作可能涉及多个DAO级别的操作,并且事务边界处于业务操作级别而不是DAO级别的优势在于您获得更加一致的状态,因为否则部分业务操作可以失败但其他人已经犯了。