Здесь много вопросов по этой теме, но все же я не понимаю, как управлять сеансом внутри транзакции.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()
вместо этого и забыть о промывке и закрытии (ведь я думаю, что транзакция может позаботиться о жизненном цикле для меня)?
Используйте их, когда имеет смысл использовать их. в 99% случаев они не полезны. Но это не имеет ничего общего с весной и транзакциями. это зависит только от конкретного варианта использования. –
Спасибо! Теперь я понял. –
Подождите ... Забыл о многопоточности ... Что делать, если мне нужно получить доступ к сеансу во многих потоках Java? Есть ли что-то другое в его жизненном цикле? –