Поправь меня, если что-то не так.
Теперь, когда мы используем Spring DAO для шаблонов ORM, когда мы используем атрибут @Transactional,
у нас нет контроля над транзакцией и / или сеансом, когда метод вызывается извне, а не внутри метода.
Ленивая загрузка экономит ресурсы - меньше запросов к БД, меньше памяти для хранения всех коллекций, извлеченных в памяти приложения.
Итак, если lazy = false, то все выбирается, все связанные коллекции, что неэффективно, если в связанном наборе 10 000 записей.
Теперь у меня есть метод в классе DAO, который должен вернуть мне объект User.
У него есть коллекции, которые представляют связанные таблицы базы данных.
Мне нужно получить объект по идентификатору, а затем запросить его коллекции.
Hibernate "не удалось лениво инициализировать коллекцию" возникает исключение, когда я пытаюсь получить доступ к связанной коллекции, которую возвращает этот метод DAO.
Объясните, пожалуйста, какой здесь обходной путь?
Обновление : Хорошо, позвольте мне спросить вас об этом. DAO - это абстрактный уровень, поэтому метод getUserById (Integer id) должен возвращать объект.
Что, если в некоторых случаях мне нужны эти связанные коллекции объекта User, а в других ситуациях мне нужны эти коллекции.
Есть только два пути:
1) ленивая загрузка = ложь
2) создать разные методы: getUserByIdWithTheseCollections (), getUserByIdWithOtherCollections () и внутри этих методов использовать ваш подход?
Я имею в виду, есть только 2 пути и ничего лучше?
Обновление 2 : Объясните, пожалуйста, что даст мне явное использование SESSIONFACTORY?
Как это выглядит на практике? Мы создаем экземпляр объекта DAO,
затем внедрить его с фабрикой сессий, и это будет означать, что два последовательных
вызовы методов для DAO будут выполняться в рамках одной транзакции?
В любом случае, мне кажется, что DAO отделен от классов, которые его используют!
Логика и транзакции инкапсулированы в DAO, верно?