0

嗨,我是 spring + hiberent 的新手,我正在尝试编写 GenericDao,但出现以下异常 No Hibernate Session bound to thread,并且配置不允许创建非事务性,请参阅我的代码

通用道

public interface IGenericDao<T> {
    public void delete(T obj);
    public void saveOrUpdate(T obj);
}

GenericDaoImpl

  @Transactional
  public class GenericDaoImpl<T> implements IGenericDao<T> {
    @Autowired
    private SessionFactory sessionFactory;
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    protected SessionFactory getSessionFactory() {
        if (sessionFactory == null)
            throw new IllegalStateException("SessionFactory has not been set on DAO before usage");
        return sessionFactory;
    }
    @Override
    public void delete(T obj) {
        getSessionFactory().getCurrentSession().delete(obj);
    }
    @Override
    public void saveOrUpdate(T obj) {
        getSessionFactory().getCurrentSession().saveOrUpdate(obj);
    }
}

通用服务

public interface IGenericService<T extends Object> {
    public void delete(T obj);
    public void saveOrUpdate(T obj);

}

IGenericServiceManagerImpl

public  class IGenericServiceManagerImpl<T extends Object> implements  IGenericService<T>  {

@Autowired
IGenericDao<T> genericDao;
@Override

public void delete(T obj) {
    // TODO Auto-generated method stub
    genericDao.delete(obj);
}

@Override

public void saveOrUpdate(T obj) {
    // TODO Auto-generated method stub
    genericDao.saveOrUpdate(obj);

}

spring-servlet.xml

   xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

       ">

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>


    <property name="annotatedClasses">
        <list>

            <value>com.codes.gdi.model.EMP</value>


        </list>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.google.appengine.api.rdbms.AppEngineDriver" />


    <property name="url" value="jdbc:google:rdbms://spring:myinstance/gdirectorystaging" />
    <property name="username" value="" />
    <property name="password" value="" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />

AnyOne帮助我我没有绑定到线程的休眠会话,并且配置不允许在这里创建非事务性会话

4

2 回答 2

1

你应该添加<context:component-scan base-package="pathToScan" />

http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s12.html (4.12.2)

于 2013-08-07T05:08:29.233 回答
0

关于您的配置,您完全缺少 dao/service bean 定义,并且您没有启用注释驱动的事务添加<tx:annotation-driven/>到 XML(记住添加xmlns:tx="http://www.springframework.org/schema/tx"http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd)。

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

如果 DAO 代码仍然无法与 Hibernate3 一起使用,请HibernateTemplate以这种方式使用

public class GenericDaoImpl extends HibernateTemplate implements IGenericDao{
  @Override
  public void delete(T obj) {
    getSession().delete(obj);
  }
}

如果您使用的是 Hibernate4,请保持 DAO 代码不变,但根据新类 ( org.springframework.orm.hibernate4.HibernateTransactionManager) 更改 bean 类并用于org.springframework.orm.hibernate4.LocalSessionFactoryBean构建 sessionFactory。

于 2013-08-07T05:27:27.010 回答