为什么
在Hibernate中事物是与session相关的,一般情况下session会在Service层创建,
Service中
Session session = HibernateUtils.openSession()
tx = session.beginTransaction();
dao.save();
dao.xxx();
tx.commit();
在Dao中就需要使用session.save()或者session.xxx(),而为了在同一个事物中执行这两个方法,所以在这两个方法中应该使用与Service中一样的session
怎么办
一 将session传递给dao层,即给为dao.save(session,obj)
二 session对象的生命周期与当前线程绑定
1.在hibernate.cfg.xml中定义常量
<property name="hibernate.current_session_context_class">thread</property>2.使用
在HibernateUtils里面添加一个方法
public Session getCurrentSession(){
return sessionFactory.getCurrentSession;
}3.注意
通过该方法获得的session对象,都不需要手动关闭,因为当当前线程结束的时候会自动关闭该session,如果手动调用的话还会出错
因为如果已经手动关掉了,线程结束的时候又关掉一次,就是重复关闭一个对象,显然会出错
在Hibernate中,事务与Session绑定,通常Session在Service层创建并传递给DAO层以保持事务一致性。本文探讨了两种方法实现DAO层使用相同Session:直接传递Session对象给DAO方法或设置Session与当前线程绑定。通过配置和特定的HibernateUtils方法,可以确保Session在事务完成后自动关闭,避免重复关闭导致的错误。
1万+

被折叠的 条评论
为什么被折叠?



