0

こんにちは、私はSpring + Hiberentを初めて使用していますが、GenericDaoを作成しようとしていますが、スレッドにバインドされたHibernateセッションがないという例外があり、構成では非トランザクションの作成が許可されていません私のコードを参照してください

IGenericDao

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);
    }
}

IGenericService

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 助けてください スレッドにバインドされた Hibernate セッションがありません。構成では、ここで非トランザクション セッションを作成することはできません

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/サービス 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 コードを変更せずに、新しいクラス ( ) に従って Bean クラスを変更し、sessionFactory をビルドするためorg.springframework.orm.hibernate4.HibernateTransactionManagerに使用します。org.springframework.orm.hibernate4.LocalSessionFactoryBean

于 2013-08-07T05:27:27.010 に答える