Запретить Dozer запускать отложенную загрузку Hibernate

Я использую транзакции Spring, поэтому транзакция все еще активна, когда происходит преобразование POJO в DTO.

Я хотел бы, чтобы Dozer не запускал ленивую загрузку, чтобы скрытые запросы sql никогда не выполнялись: все выборки должны выполняться явно через HQL (чтобы получить наилучший контроль над производительностью).

  1. Это хорошая практика (я нигде не могу найти ее задокументированной)?

  2. Как это сделать безопасно?

Я пробовал это до преобразования 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 и не предотвращает отложенную загрузку.

16
задан matt b 5 April 2011 в 13:15
поделиться