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

时间:2015-04-27 15:54:40

标签: java spring hibernate

我正在开发一个非常大的旧的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+可以为我处理这些事务吗?

我真的不认为升级这种常用技术的“阻力最小”的方法会让我的手弄脏会话会话和交易范围。

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级别的优势在于您获得更加一致的状态,因为否则部分业务操作可以失败但其他人已经犯了。