2013-08-19 3 views
3

Здесь много вопросов по этой теме, но все же я не понимаю, как управлять сеансом внутри транзакции.Spring + Hibernate: управление сеансом в методах @Transactional

Давайте предположим, что есть некоторые репо:

@Repository 
public class SomeRepository { 
    @Autowired 
    protected SessionFactory sessionFactory; 

    @Transactional 
    public void doSomething() throws IOException { 
     Session session = getSession(); 
     List<SomeEntity> someEntities = session.createCriteria(SomeEntity.class).list(); 
     for (int i = index; i < someEntities.size(); i++) { 
      /* Some ops with entities */ 
      if (i % 100 == 0) { 
       session.flush(); 
       session.clear(); 
      } 
     } 
     session.close; 
    } 

    protected Session getSession() { 
     return sessionFactory.openSession(); 
    } 
} 

Является ли этот код правильно? Мне действительно нужно открывать и закрывать (и скрывать и очищать) сессию вручную каждый раз, когда выполняется операция? Могу ли я использовать getCurrentSession() вместо этого и забыть о промывке и закрытии (ведь я думаю, что транзакция может позаботиться о жизненном цикле для меня)?

ответ

7

Нет, это неправильно. Чтобы получить сеанс, связанный с текущей транзакцией Spring, вы должны использовать sessionFactory.getCurrentSession().

И вы никогда не должны закрывать сеанс: это задание Spring, которое закроет его, когда транзакция совершает/откаты или даже позже в шаблоне open-session-in-view.

Промывка обычно не требуется, за исключением ситуации, описанной в документации Hibernate, и которая заключается в том, чтобы избежать увеличения размера кеша первого уровня при вставке большого количества объектов в пакетном режиме. В вашем случае это не имеет смысла.

+0

Используйте их, когда имеет смысл использовать их. в 99% случаев они не полезны. Но это не имеет ничего общего с весной и транзакциями. это зависит только от конкретного варианта использования. –

+0

Спасибо! Теперь я понял. –

+0

Подождите ... Забыл о многопоточности ... Что делать, если мне нужно получить доступ к сеансу во многих потоках Java? Есть ли что-то другое в его жизненном цикле? –