Hibernate模板关闭事务

时间:2009-09-18 10:03:33

标签: java hibernate spring session transactions

我运行以下工作代码:

    Session session = null;

    try {

        SessionFactory sessionFactory = new Configuration().configure()
                .buildSessionFactory();
        session = sessionFactory.openSession();

        String id = (String) FacesContext.getCurrentInstance()
                .getExternalContext().getRequestParameterMap().get(
                        "storeId");

        Transaction t = session.beginTransaction();

        stores = getStores();

        for (Store store : stores) {
            if (store.getId() == Integer.parseInt(id)) {
                session.delete(store);
            }
        }
        t.commit();
    } catch (Exception e) {
    } finally {
        session.close();
    }
}

当我尝试重做此代码以使用Hibernate模板时,我会向DB发送无休止的请求:

    HibernateTemplate template = new HibernateTemplate();
    template .setSessionFactory(sessionFactory);

    stores = template.find("from Stores");

    for (Store store : stores) {
      if (store.getId() == Integer.parseInt(id)) {
        template.delete(store);
}}

看起来交易没有关闭。

我怎么能在这种情况下关闭交易?是否会更好地使用Hibernate模板方法而不是在第一个代码中显示的会话方法?

1 个答案:

答案 0 :(得分:5)

你没有说出来,但我认为你指的是Spring Framework中的 HibernateTemplate 类。 HibernateTemplate 参与Spring事务,但它不会自行管理它们。 Spring提供lot of ways来以编程方式和声明方式管理事务。如果您只是在试验,可以使用TransactionTemplate类快速测试它。对于较大的项目,您应该考虑使用声明式事务管理,因为它简化了代码,尽管最初设置起来有点棘手。

至于 HibernateTemplate 方法是否比手动管理会话更好,我会说减少样板代码的任何事情都是好事,所以是的。这对大型项目尤其重要。但是,根据您的项目,甚至可能不需要 HibernateTemplate 。它最初是为了解决Hibernate 2.x中的一些缺陷而创建的,但是在Hibernate 3中消除了许多这些缺陷。因此在采用它之前,请阅读HibernateTemplate JavaDoc以讨论优势。