我运行以下工作代码:
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模板方法而不是在第一个代码中显示的会话方法?
答案 0 :(得分:5)
你没有说出来,但我认为你指的是Spring Framework中的 HibernateTemplate 类。 HibernateTemplate 参与Spring事务,但它不会自行管理它们。 Spring提供lot of ways来以编程方式和声明方式管理事务。如果您只是在试验,可以使用TransactionTemplate类快速测试它。对于较大的项目,您应该考虑使用声明式事务管理,因为它简化了代码,尽管最初设置起来有点棘手。
至于 HibernateTemplate 方法是否比手动管理会话更好,我会说减少样板代码的任何事情都是好事,所以是的。这对大型项目尤其重要。但是,根据您的项目,甚至可能不需要 HibernateTemplate 。它最初是为了解决Hibernate 2.x中的一些缺陷而创建的,但是在Hibernate 3中消除了许多这些缺陷。因此在采用它之前,请阅读HibernateTemplate JavaDoc以讨论优势。