java – 如何解决当前线程找不到会话

前端之家收集整理的这篇文章主要介绍了java – 如何解决当前线程找不到会话前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图做通用的DAO的实现方式,我按照 Article

以下是我的genericDaoImpl类

@H_502_4@@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

@H_502_4@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() ; }

服务类

@H_502_4@@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; } }

这是我的daoImpl

@H_502_4@@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配置xml

@H_502_4@<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>

我不能找到原因

@H_502_4@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)

解决方法

尝试删除以下属性: @H_502_4@<prop key="hibernate.transaction.auto_close_session">true</prop>

我相信Hibernate会很快关闭会话,导致你的错误.由于您使用Spring TransactionManager,请关闭会话.

原文链接:https://www.f2er.com/java/124133.html

猜你在找的Java相关文章