gpt4 book ai didi

java - 如何解决当前线程未找到 session

转载 作者:IT老高 更新时间:2023-10-28 13:45:52 24 4
gpt4 key购买 nike

我试图采用通用的 DAO 实现方式,并按照 Article 进行操作。

以下是我的 genericDaoImpl 类

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

@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

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

找不到原因

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)

最佳答案

您是否尝试删除以下属性:

<prop key="hibernate.transaction.auto_close_session">true</prop>

我相信 Hibernate 会过早关闭 session 并导致您的错误。既然你用的是 Spring TransactionManager,那就让它关闭 session 吧。

关于java - 如何解决当前线程未找到 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38397157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com