@Repository
public class XdoDaoSupport implements XdoDao {
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
public XdoDaoSupport() {
}
public Session getSession() {
return this.sessionFactory.getCurrentSession();
}
}
测试:
System.out.println(xdoDaoSupport.getSession().isOpen());
通过上述方法获取session,会报错,报错信息如下:
org.springframework.orm.hibernate4.HibernateSystemException: Could not obtain transaction-synchronized Session for current thread; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:218)
at org.springframework.orm.hibernate4.HibernateExceptionTranslator.convertHibernateAccessException(HibernateExceptionTranslator.java:57)
at org.springframework.orm.hibernate4.HibernateExceptionTranslator.translateExceptionIfPossible(HibernateExceptionTranslator.java:44)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.xms.xpo.base.dao.hibernate.XdoDaoSupport$$EnhancerBySpringCGLIB$$c6f22f9b.getSession(<generated>)
报错原因:未将session纳入事务管理,解决办法如下:
@Service
@Transactional
public class BaseManagerImpl implements BaseManager {
@Autowired
private XdoDao xdoDao;
public BaseManagerImpl() {
}
public Session getSession() {
return this.xdoDao.getSession();//可以获取session
}
}
事务在执行完成后会自动关闭session!!!
所以,当在其他处调用该方法时,会出现该session已关闭的错误,需注意:
其他类中调用
@Autowired
BaseManager baseManager;
System.out.println(baseManager.getSession().isOpen());//false
如需在其他类中调用,则需在该类中加入事务管理,来覆盖BaseManagerImpl的事务,以避免关闭session