2012-07-05 75 views
1

我試圖將Spring 3.1與Hibernate 4.1.4集成在一起,但是我從通用DAO獲取會話時遇到了問題。getCurrentSession不會將會話綁定到上下文,openSession不會

問題是,如果我使用getCurrentSession()我得到一個NullPointerException和休眠說沒有會話綁定到上下文,但如果我使用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); 
     } 
    } 
    (...) 

} 

我的Spring配置文件:

<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) 
+0

請張貼你得到的例外。 – 2012-07-05 16:09:24

+0

它現在在那裏。 – 2012-07-05 16:15:43

回答

1

我看不到任何東西在這個配置中實際上會爲你打開一個Hibernate會話,或者控制何時完成。

如果您是Spring的新手,您可能只想在您的web.xml中配置OpenSessionInViewFilter以打開會話並自動綁定到每個請求。

+0

我被告知,但我真的不知道如何設置它的桌面應用程序 – 2012-07-05 16:26:24

+0

對不起,我在這個印象中這是一個web應用程序。對於桌面應用程序,您需要自己決定何時打開會話,如何控制何時將更改刷新到數據庫,事務劃分等。我建議給予http://static.springsource.org /spring/docs/3.0.x/spring-framework-reference/html/orm.html#orm-hibernate如果您尚未閱讀,請閱讀。 – 2012-07-05 17:50:03