Получение сеанса JPA в Spring Boot Scheduler

В моем Spring Boot Webapp у меня есть класс планировщика с @EnableScheduling и @EnableAsync, который работает ночью @Scheduled. Класс получает сеанс с:

Session session = entityManager.unwrap(Session.class);

что приводит к этому исключению:

org.hibernate.SessionException: Session is closed!

Как правильно получить сеанс для запланированных задач?

Вот такой код:

        Session session = em.unwrap(Session.class);
        Query query = session.createQuery("SELECT l FROM Lei l ORDER BY l.id");
        query.setFetchSize(Integer.valueOf(1000));
        query.setReadOnly(true);
        query.setLockMode("a", LockMode.NONE);
        // http://stackoverflow.com/questions/5067619/jpa-what-is-the-proper-pattern-for-iterating-over-large-result-sets
        ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
        while (results.next()) {
            Lei lei = (Lei) results.get(0);
            writer.writeLEI(lei);
        }
        results.close();
        session.close();

person ropo    schedule 22.09.2016    source источник
comment
можешь опубликовать еще код?   -  person jahra    schedule 22.09.2016
comment
Зачем вам _1 _... Что я плохого в использовании простого EntityManager?   -  person M. Deinum    schedule 22.09.2016


Ответы (2)


Вот только что созданный мной тестовый сервис (я использую Spring boot 1.4 со всей конфигурацией по умолчанию):

@Service
public class ScheduledService {
    @Autowired
    private EntityManager entityManager;

    @Async
    @Scheduled(fixedRate = 500L)
    @Transactional
    private void reportCurrentTime() {
        entityManager = entityManager.getEntityManagerFactory().createEntityManager();
        Session session = entityManager.unwrap(Session.class);

        System.out.println(session.hashCode());
    }
}

Затем я вижу хэш-код сеанса в консоли

1410300721
966623925
181180995
1606490891
1882727729
635804073
1259672020
484131582
person Liping Huang    schedule 22.09.2016
comment
Я также могу отобразить hashCode, но затем я выполняю запрос и получаю исключение выше - person ropo; 22.09.2016
comment
У меня работает выполнение запроса в вашем примере. Теперь мне нужно разобраться, почему это не работает в моем проекте. - person ropo; 22.09.2016

Нашел проблему. Глупый я! Я закрыл сессию

session.close ();

person ropo    schedule 22.09.2016