java - getCurrentSession 给出 No Session Bound to Context,openSession 则没有

标签 java spring hibernate

我正在尝试将 Spring 3.1 与 Hibernate 4.1.4 集成,但从通用 DAO 获取 session 时遇到问题。

问题是,如果我使用 getCurrentSession() ,我会得到一个 NullPointerException 并且 Hibernate 说没有 session 绑定(bind)到上下文,但如果我使用 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>

异常(exception):

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)

最佳答案

我在此配置中没有看到任何实际会为您打开 Hibernate session 或控制何时完成的内容。

如果您是 Spring 新手,您可能只想配置 OpenSessionInViewFilter在您的 web.xml 中打开 session 并自动绑定(bind)到每个请求。

关于java - getCurrentSession 给出 No Session Bound to Context,openSession 则没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348223/

相关文章:

java - 在几行 java 代码中将 url 读取为字符串

java - 在 Java 中创建临时文件的安全方法是什么?

css - 外部 CSS 不会加载到网页中

java - 桌面应用程序中的 spring 验证

java - 如何更改 Hibernate 映射而不导致数据库崩溃

java - Gradle错误: Error:Error converting bytecode to dex: Cause: java. lang.RuntimeException:异常解析类

java - 向 HttpServletRequest 添加额外参数

hibernate - EhCache配置文件中的UpdateTimestampsCache需要什么?

java - 如何将实体绑定(bind)到特定的持久性单元

java - 这两个 : BigInteger. valueOf(10000) 和 BigInteger.valueOf(0010000) 有什么区别?