Я использую транзакции Spring, поэтому транзакция все еще активна, когда происходит преобразование POJO в DTO.
Я хотел бы, чтобы Dozer не запускал ленивую загрузку, чтобы скрытые запросы sql никогда не выполнялись: все выборки должны выполняться явно через HQL (чтобы получить наилучший контроль над производительностью).
Это хорошая практика (я нигде не могу найти ее задокументированной)?
Как это сделать безопасно?
Я пробовал это до преобразования DTO:
PlatformTransactionManager tm = (PlatformTransactionManager) SingletonFactoryProvider.getSingletonFactory().getSingleton("transactionManager");
tm.commit(tm.getTransaction(new DefaultTransactionDefinition()));
Я не знаю, что происходит с транзакцией, но сеанс Hibernate не закрывается, и ленивая загрузка по-прежнему происходит.
Я пробовал следующее:
SessionFactory sf = (SessionFactory) SingletonFactoryProvider.getSingletonFactory().getSingleton("sessionFactory");
sf.getCurrentSession().clear();
sf.getCurrentSession().close();
И это предотвращает ленивую загрузку, но так ли это? Хорошая практика для управления сеансом непосредственно на уровне приложения (который в моем проекте называется «фасадом»)? Каких негативных побочных эффектов мне следует опасаться? (Я' Мы уже видели, что тесты, включающие преобразования POJO -> DTO, больше не могут быть запущены через тестовые классы Spring AbstractTransactionnalDatasource, потому что эти классы пытаются вызвать откат транзакции, которая больше не связана с активным сеансом).
Я также попытался установить для распространения значение NOT_SUPPORTED или REQUIRES_NEW, но он повторно использует текущий сеанс Hibernate и не предотвращает отложенную загрузку.