Java – how to solve the problem that the current thread cannot find a session
•
Java
I try to do the implementation of general Dao according to article
Here is my genericdaoimpl class
@SuppressWarnings("unchecked") @Repository public abstract class GenericDaoImpl<E,K extends Serializable> implements GenericDao<E,K> { @Autowired private SessionFactory sessionFactory; protected Class<? extends E> daoType; /** * By defining this class as abstract,we prevent Spring from creating * instance of this class If not defined as abstract,* getClass().getGenericSuperClass() would return Object. There would be * exception because Object class does not hava constructor with parameters. */ public GenericDaoImpl() { Type t = getClass().getGenericSuperclass(); ParameterizedType pt = (ParameterizedType) t; daoType = (Class) pt.getActualTypeArguments()[0]; } protected Session currentSession() { return sessionFactory.getCurrentSession(); } @Override public void add(E entity) { currentSession().save(entity); } @Override public void saveOrUpdate(E entity) { currentSession().saveOrUpdate(entity); } @Override public void update(E entity) { currentSession().saveOrUpdate(entity); } @Override public void remove(E entity) { currentSession().delete(entity); } @Override public E find(K key) { return (E) currentSession().get(daoType,key); } @Override public List<E> getAll() { return currentSession().createCriteria(daoType).list(); } }
GENERICDAO
public interface GenericDao<E,K> { public void add(E entity) ; public void saveOrUpdate(E entity) ; public void update(E entity) ; public void remove(E entity); public E find(K key); public List<E> getAll() ; }
Service class
@Service public class test { @Autowired TestPlanDao testPlanDao; @Transactional(propagation = Propagation.required) public int saveTestPlan() { try { TestPlan tp=new TestPlan(); tp.setTestplan_version(1); testPlanDao.saveTestPlan(tp); logger.info("testplan saved"); return 1; } catch(Exception e) { e.printStackTrace(); logger.error(e.getMessage(),e); return 0; } }
This is my daoimpl
@Repository public class TestPlanDaoImpl extends GenericDaoImpl<TestPlan,Integer> implements TestPlanDao{ @Override @Transactional public void saveTestPlan(TestPlan tp) { // TODO Auto-generated method stub add(tp); }
Hibernate configuration XML
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.MysqL.jdbc.Driver" /> <property name="url" value="jdbc:MysqL://${MysqLHost}/${MysqLdatabase}" /> <property name="username" value="${MysqLUserName}" /> <property name="password" value="${MysqLPassword}" /> <property name="removeAbandoned" value="true" /> <property name="initialSize" value="20" /> <property name="maxActive" value="30" /> <property name="maxIdle" value="-1" /> <property name ="testOnBorrow" value="true"/> <property name ="validationQuery" value="SELECT 1"/> </bean> <bean id="sessionFactoryConf" class="org.springframework.orm.hibernate4.LocalSessionfactorybean"> <property name="dataSource" ref="dataSource" /> <property name="annotatedClasses"> <list> <value>com.test.model.TestPlan</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MysqLDialect</prop> <prop key="hibernate.transaction.auto_close_session">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean>
I can't find the reason
org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:988)
Solution
Try deleting the following properties:
<prop key="hibernate.transaction.auto_close_session">true</prop>
I believe hibernate will close the session soon, resulting in your error Since you are using spring transaction manager, please close the session
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码