【问题标题】:org.hibernate.HibernateException:No Hibernate Session bound to threadorg.hibernate.HibernateException:没有绑定到线程的休眠会话
【发布时间】:2015-01-21 09:13:33
【问题描述】:

我想调用下一条语句:

public List<User> getList(int master_id) {
        Session session = sessionFactory.getCurrentSession();
        try {
            List<User> result = (List<User>) sessionFactory.getCurrentSession()
                    .createQuery("from User WHERE master_id=:master_id")
                    .setInteger("master_id", master_id).list();
            return result;
        } finally {
            session.close();
        }
    }

然后我抓住了

没有 Hibernate Session 绑定到线程,并且配置不允许 在这里创建非事务性的

有人说我必须为此添加@Transactional 注释,但正如您所见,没有必要这样做,因为它是SELECT 查询。做什么?

hibernate.cfg:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <mapping class="ru.tenet.smsc.domain.User" />   
        <mapping class="ru.tenet.smsc.domain.UserRoles" />
        <mapping class="ru.tenet.smsc.domain.WhiteList" />
        <mapping class="ru.tenet.smsc.domain.BlackList" />
        <mapping class="ru.tenet.smsc.domain.Distribution" />
        <mapping class="ru.tenet.smsc.domain.Range" />
        <mapping class="ru.tenet.smsc.domain.SmsEntity" />
        <mapping class="ru.tenet.smsc.domain.Archive" />
        <mapping class="ru.tenet.smsc.domain.Priority" />
    </session-factory>

</hibernate-configuration>

会话工厂:

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>/WEB-INF/db/hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.dialect"> org.hibernate.dialect.OracleDialect</prop>
                <prop key="hibernate.connection.useUnicode">true</prop>
                <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
            </props>
        </property>
    </bean>

【问题讨论】:

  • 您可以粘贴以下来源:hibernate.cfg 和 sessionFactory 吗?

标签: java spring hibernate


【解决方案1】:

@Transactional 不仅适用于插入/更新,也适用于 SELECT。您可以看到这一点,因为注释的参数之一可以是 readOnly=true(这意味着您的事务不会提交任何内容)

【讨论】:

    【解决方案2】:

    你必须将当前会话绑定到当前线程

    Session session = SessionFactoryUtils.getSession(sessionFactory, true);
    TransactionSynchronizationManager.bindResource(sessionFactory, 
    new SessionHolder(session));
    try {
     do your work ...
    }
    finally {
      TransactionSynchronizationManager.unbindResource(sessionFactory);
      SessionFactoryUtils.closeSessionIfNecessary(session, sessionFactory);
    }  
    

    如果你有一个 webapp,那么你应该添加 Spring OpenEntityManagerInViewFilter 过滤器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2023-03-11
      • 2011-10-25
      • 2011-01-31
      相关资源
      最近更新 更多