Java 没有绑定到线程的Hibernate会话,并且配置不允许在此创建非事务会话

Java 没有绑定到线程的Hibernate会话,并且配置不允许在此创建非事务会话,java,hibernate,Java,Hibernate,这个错误是关于什么的?“没有绑定到线程的Hibernate会话,并且配置不允许在此处创建非事务会话。”。 我的spring配置文件看起来像这样 <bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:/devDS</value>

这个错误是关于什么的?“没有绑定到线程的Hibernate会话,并且配置不允许在此处创建非事务会话。”。 我的spring配置文件看起来像这样

<bean id="jndiDataSource"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:/devDS</value>
    </property>
</bean>
<bean id="stsaDBFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="jndiDataSource" />
    <property name="annotatedClasses">
        <list>
            <value>xx.yy.zz.User</value>
            <value>xx.yy.UserResponse</value>

        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbmddl.auto">create</prop>
        </props>
    </property>
</bean>

<!-- ################################### Aspects ################################################## -->

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

java:/devDS
xx.yy.zz.User
xx.yy.UserResponse
真的
创造

当我使用junit在容器外部测试DAO时,所有DAO测试都通过了。当我将它作为门户应用程序部署到jBoss中时,我遇到了这个异常。另外,如果我删除特定于门户的配置,使其成为一个简单的web应用程序,并将其部署到jboss上,它也可以正常工作。有什么想法吗?

您已经在spring配置中定义了TransactionManager,但您正在尝试使用非事务性的方法执行hibernate查询。尝试将@Transactional添加到您的方法或类。

我通过将
hibernate config
中的
当前会话上下文类指定为“
线程
”,解决了这个问题,如中所示的简单配置

但它建议,在生产中使用它并不安全

尝试在
hibernate配置中添加以下内容也会有所帮助:

<property name="current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property>
org.hibernate.context.ThreadLocalSessionContext

查看更多详细信息。

这只是一个选择查询。我必须将此注释添加到所有DAO方法吗?它可以在DAO方法上,也可以在服务方法上,或者在任何一个类上,但是,如果您使用TransactionManager,则它必须位于堆栈中的某个位置,否则您将遇到异常,因为您尝试在事务外部运行查询。它们可能是在未定义TransactionManager的上下文中运行的?默认情况下,它可以在没有注释的情况下工作,事务划分应该在配置中定义,除非使用元素(请参阅)。我不认为在每个方法和/或类中添加
@Transacional
是正确的解决方案。这只是对尝试此操作并使用Spring的人的一个警告:我只是在配置“当前会话\u上下文\u类”时遇到了一个不同的错误。在其他几个问题上,这让位于交易问题。这似乎有效地消除了spring事务管理。(参见示例:)我也有不同的行为。我从数据库中加载了一个对象,进行了更改,然后尝试将其持久化。为了让它工作,我必须将它从会话中逐出,然后保存。另请参阅