2015-01-21 4 views
0

Я хочу назвать следующее заявление:org.hibernate.HibernateException: Нет Hibernate Session обязан нить

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 аннотацию к этому, б ut, как вы можете видеть, нет необходимости делать это, потому что это запрос 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> 

SessionFactory:

<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> 
+0

Можете ли вы вставить источники для: hibernate.cfg и sessionFactory? – Kiki

+0

Да, пожалуйста, посмотрите – Tony

ответ

0

@Transactional не только для вставки/обновления, также для операторов SELECT. Вы можете увидеть это, потому что один из параметров аннотаций может быть доступен только для чтения = истина (это означает, что транзакция не собирается совершить что-нибудь)

0

Вы должны связать текущую сессию текущего потока

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 фильтр

Смежные вопросы