1

Spring3.1をHibernate4.1.4と統合しようとしていますが、汎用DAOからセッションを取得するときに問題が発生します。

問題は、getCurrentSession()を使用すると、NullPointerExceptionが発生し、Hibernateが「セッションはコンテキストにバインドされていません」と表示しますが、openSessionを使用すると、すべてが機能しているように見えることです。どういうわけか、getCurrentSessionを使用する必要があると感じていますが、問題の原因を見つけることができません。

私はこれをインターネットで検索しましたが、どの解決策もうまくいきませんでした。

これが私のgenericDAOコードです:

public class GenericDaoHibernateImpl<E, PK extends Serializable> implements GenericDao<E, PK> {

    private Class<E> entityClass;

    protected GenericDataBaseExceptionHandler exceptionHandler;

    private SessionFactory sessionFactory;  

    @SuppressWarnings("unchecked")
    public GenericDaoHibernateImpl() {
        this.entityClass = (Class<E>) ((ParameterizedType) getClass().
            getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public void setExceptionHandler(GenericDataBaseExceptionHandler exceptionHandler) {
        this.exceptionHandler = exceptionHandler;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    protected Session getSession() {
        if (sessionFactory.getCurrentSession() == null)
            throw new IllegalStateException("Session has not been set on DAO before usage");
        return sessionFactory.getCurrentSession(); //This crashes
//      return sessionFactory.openSession(); //This does not
    }

    public Class<E> getEntityClass() {
        return entityClass;
    }

    public void persist(E entity) throws GenericDataBaseException {
        try {
            getSession().persist(entity);       
        } catch (Throwable t) {
            Collection<Object> args = new ArrayList<Object>();
            args.add(entity);
            throw exceptionHandler.handle(t, "persist", args);
        }
    }
    (...)

}

そして私の春の設定ファイル:

    <context:annotation-config />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="jdbcUrl">
            <value>jdbc:mysql://localhost/forestool</value>
        </property>
        <property name="user">
            <value>forestool</value>
        </property>
        <property name="password">
            <value>forestool</value>
        </property>
    </bean>


    <!-- Declaración de la factoría de sesiones hibernate con los mappings necesarios -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
        <property name="mappingLocations">
            <list>
                <value>classpath*:/hbm/*.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <ref bean="hibernateProperties"/>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
     <property name="sessionFactory">
         <ref bean="sessionFactory"/>
     </property>
    </bean>
<bean id="hibernateProperties" class="java.util.Properties">
    <constructor-arg index="0">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
        </props>
    </constructor-arg>
</bean>

例外:

org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)
    at es.fsc.core.dao.impl.GenericDaoHibernateImpl.getSession(GenericDaoHibernateImpl.java:83)
    at es.fsc.core.dao.impl.GenericDaoHibernateImpl.findAll(GenericDaoHibernateImpl.java:244)
    at es.fsc.dao.explotacion.impl.ExplotacionDaoImpl.getExplotacionesAbiertas(ExplotacionDaoImpl.java:21)
    at es.fsc.service.explotacion.impl.ExplotacionServiceImpl.getExplotacionesAbiertas(ExplotacionServiceImpl.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    at $Proxy5.getExplotacionesAbiertas(Unknown Source)
    at es.fsc.app.FscApp.runApp(FscApp.java:58)
    at es.fsc.app.App.run(App.java:65)
    at es.fsc.main.Main.main(Main.java:20)
Exception in thread "main" java.lang.NullPointerException
    at es.fsc.core.dao.impl.GenericDaoHibernateImpl.findAll(GenericDaoHibernateImpl.java:253)
    at es.fsc.dao.explotacion.impl.ExplotacionDaoImpl.getExplotacionesAbiertas(ExplotacionDaoImpl.java:21)
    at es.fsc.service.explotacion.impl.ExplotacionServiceImpl.getExplotacionesAbiertas(ExplotacionServiceImpl.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    at $Proxy5.getExplotacionesAbiertas(Unknown Source)
    at es.fsc.app.FscApp.runApp(FscApp.java:58)
    at es.fsc.app.App.run(App.java:65)
    at es.fsc.main.Main.main(Main.java:20)
4

1 に答える 1

1

この構成には、実際に Hibernate セッションを開いたり、それがいつ行われるかを制御したりするものは何もありません。

Spring を初めて使用する場合は、 OpenSessionInViewFilterを構成web.xmlして、セッションを開いて各リクエストに自動的にバインドすることをお勧めします。

于 2012-07-05T16:19:47.277 に答える