Я использую транзакции 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 и не предотвращает ленивую загрузку.