没有 Hibernate Session 绑定到线程异常

发布于 2024-10-10 04:58:17 字数 4417 浏览 0 评论 0原文

我有 Hibernate 3.6.0.Final 和 Spring 3.0.0.RELEASE

我得到“没有 Hibernate 会话绑定到线程,并且配置不允许在此处创建非事务会话”

如果我重新添加线程规范,我得到“如果没有活动事务,saveOrUpdate 无效”

有什么想法吗?

spring-config.xml:

<context:annotation-config />
<context:component-scan base-package="com.maxheapsize" />

<bean id="dataSource"
         class="org.apache.commons.dbcp.BasicDataSource" 
         destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:mem:jsf2demo"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

<bean id="sampleSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="sampleDataSource"/>
    <property name="annotatedClasses">
        <list>
            <value>com.maxheapsize.jsf2demo.Book</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <!-- prop key="hibernate.connection.pool_size">0</prop-->
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <!-- prop key="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
            <prop key="hibernate.current_session_context_class">thread</prop-->
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>

 <bean id="sampleDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>org.hsqldb.jdbcDriver</value>
    </property>
    <property name="url">
        <value>
            jdbc:hsqldb:file:/spring/db/springdb;SHUTDOWN=true
        </value>
    </property>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

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

<bean id="daoTxTemplate" abstract="true"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
        <props>
            <prop key="create*">
                PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED
            </prop>
            <prop key="get*">
                PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED
            </prop>
        </props>
    </property>
</bean>

<bean name="openSessionInViewInterceptor"
    class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
    <property name="sessionFactory" ref="sampleSessionFactory"/>
    <property name="singleSession" value="true"/>
</bean>

<bean id="nameDao" parent="daoTxTemplate">
    <property name="target">
        <bean class="com.maxheapsize.dao.NameDao">
            <property name="sessionFactory" ref="sampleSessionFactory"/>
        </bean>
    </property>
</bean>

和 DAO:

public class NameDao {
    private SessionFactory sessionFactory;

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

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    @Transactional
    @SuppressWarnings("unchecked")
    public List<Name> getAll() {
        Session session = this.sessionFactory.getCurrentSession();
        List<Name> names = (List<Name>)session.createQuery("from Name").list();
        return names;
    }

    //@Transactional(propagation= Propagation.REQUIRED, readOnly=false)
    @Transactional
    public void save(Name name){
        Session session = this.sessionFactory.getCurrentSession();
        session.saveOrUpdate(name);
        session.flush();
    }
}

I have Hibernate 3.6.0.Final and Spring 3.0.0.RELEASE

I get "No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here"

If I add the thread specification back in, I get "saveOrUpdate is not valid without active transaction"

Any ideas?

The spring-config.xml:

<context:annotation-config />
<context:component-scan base-package="com.maxheapsize" />

<bean id="dataSource"
         class="org.apache.commons.dbcp.BasicDataSource" 
         destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:mem:jsf2demo"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

<bean id="sampleSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="sampleDataSource"/>
    <property name="annotatedClasses">
        <list>
            <value>com.maxheapsize.jsf2demo.Book</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <!-- prop key="hibernate.connection.pool_size">0</prop-->
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <!-- prop key="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
            <prop key="hibernate.current_session_context_class">thread</prop-->
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>

 <bean id="sampleDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>org.hsqldb.jdbcDriver</value>
    </property>
    <property name="url">
        <value>
            jdbc:hsqldb:file:/spring/db/springdb;SHUTDOWN=true
        </value>
    </property>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

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

<bean id="daoTxTemplate" abstract="true"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
        <props>
            <prop key="create*">
                PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED
            </prop>
            <prop key="get*">
                PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED
            </prop>
        </props>
    </property>
</bean>

<bean name="openSessionInViewInterceptor"
    class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
    <property name="sessionFactory" ref="sampleSessionFactory"/>
    <property name="singleSession" value="true"/>
</bean>

<bean id="nameDao" parent="daoTxTemplate">
    <property name="target">
        <bean class="com.maxheapsize.dao.NameDao">
            <property name="sessionFactory" ref="sampleSessionFactory"/>
        </bean>
    </property>
</bean>

and the DAO:

public class NameDao {
    private SessionFactory sessionFactory;

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

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    @Transactional
    @SuppressWarnings("unchecked")
    public List<Name> getAll() {
        Session session = this.sessionFactory.getCurrentSession();
        List<Name> names = (List<Name>)session.createQuery("from Name").list();
        return names;
    }

    //@Transactional(propagation= Propagation.REQUIRED, readOnly=false)
    @Transactional
    public void save(Name name){
        Session session = this.sessionFactory.getCurrentSession();
        session.saveOrUpdate(name);
        session.flush();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

2024-10-17 04:58:17

Spring 版本不是你的问题。

我还建议不要用交易来注释您的 DAO。它们属于注入了 DAO 的服务层。这也是会话发挥作用的地方:打开用例的会话,执行它,关闭事务,清理它。

Spring version isn't your issue.

I'd also recommend not annotating your DAO with transactions. Those belong on a service tier that has the DAO injected in. That's where the session comes in as well: open the session for the use case, execute it, close the transaction, clean it up.

长不大的小祸害 2024-10-17 04:58:17

您忘记启用注释驱动的事务管理。在链接中,搜索 tx:advice

You forgot to enable annotation driven transaction management. In the link, search for tx:advice.

つ可否回来 2024-10-17 04:58:17

添加

<beans xmlns:tx="http://www.springframework.org/schema/tx

将和

<tx:annotation-driven /> 

到您的上下文文件中。

Add

<beans xmlns:tx="http://www.springframework.org/schema/tx

and

<tx:annotation-driven /> 

to your context file.

只为一人 2024-10-17 04:58:17

注释 hibernate.cfg.xml 文件中的属性

thread

Comment the property in the hibernate.cfg.xml file

thread
甜中书 2024-10-17 04:58:17

添加 taransaction 管理器:

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

<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>

并使用 @Transactional 注释所有 DAO 类

add taransaction manager :

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

<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>

and annotate all ur DAO classes with @Transactional

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文