【问题标题】:HibernateSystemException: No Hibernate Session bound to threadHibernateSystemException:没有绑定到线程的休眠会话
【发布时间】:2011-07-04 11:50:03
【问题描述】:

我得到了 HibernateSystemException,尽管我做了不同论坛上提到的所有事情。

这是applicationContext.xml的一部分

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

我还在班级上方放置了@Transactional 注释。

@Transactional
public class MyClassImpl

【问题讨论】:

    标签: java hibernate spring


    【解决方案1】:

    A) 这是错误的事务管理器:

    <bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    

    你需要org.springframework.orm.hibernate3.HibernateTransactionManager,正如你在13.3.3 Hibernate > Declarative transaction demarcation中看到的那样。

    DataSourceTransactionManager 用于普通 JDBC,而不用于 Hibernate(请参阅12.3.8 JDBC > DataSourceTransactionManager)。

    B) 你也需要这条线:

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

    【讨论】:

    • 我们的另一个应用程序正在使用我在问题中提到的 transactionManager 运行。
    • @imran 好的,然后另一个应用程序使用 JDBC,而不是 Hibernate。如果两者并行运行,您将需要两个不同的事务管理器,请参阅以下建议:static.springsource.org/spring/docs/3.0.x/…
    • 我正在使用@Transactional,但它不起作用。实际上,我的班级不在 applicationcontext.xml 文件中定义的基础包中。
    【解决方案2】:

    您是否检查过此标记是否存在于您的应用程序上下文文件中?

    <context:annotation-config />
    

    有必要考虑您的注释。

    【讨论】:

    • 此标记不在我的应用程序上下文文件中。我们的另一个应用程序在没有此标记的情况下成功运行。
    • @Alex 我在 Spring 文档中看不到需要这样做的提示
    • @Sean Patrick Floyd 你是对的。实际上,这个标记只需要激活 Spring 各种注解,如 Autowired、PostConstruct、PreDestroy 和 Resource。抱歉……
    • @Alex 要清楚:这个注释非常有意义,拥有它是一件很棒的事情。此功能不是必需的
    【解决方案3】:

    你的配置中是否包含了 tx 命名空间?

    【讨论】:

    • 在我的 applicationContext.xml 中。 tx 是这样使用的
    • @imran tariq,如果使用 Springsource Tool Suite,在您的 xml 文件的编辑器底部,您应该会看到一个名为命名空间的选项卡,单击命名空间选项卡并确保选中 tx。
    【解决方案4】:

    在做任何请求之前,你可以试试这段代码:

    Session session = SessionFactoryUtils.getSession(dataSource, null, null);
    TransactionSynchronizationManager.bindResource(dataSource, new SessionHolder(session));
    

    请随时通知我。

    【讨论】:

    • 使用 Spring 的声明式事务管理的全部意义在于,我们不必编写这样的基础设施代码
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2023-03-11
    • 2011-10-25
    • 2011-01-31
    相关资源
    最近更新 更多