Я использую транзакции 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, больше нельзя запускать через тестовые классы AbstractTransactionnalDatasource Spring, потому что эти классы пытаются вызвать откат транзакции, которая больше не связана с активным сеансом).
Я также пытался установить для распространения значение NOT_SUPPORTED или REQUIRES_NEW, но он повторно использует текущий сеанс Hibernate и не предотвращает ленивую загрузку.