Я успешно решил все свои проблемы с отложенной инициализацией с помощью Open Session In View -pattern (т. Е. Реализация Spring). Технологии, которые я использовал, были такими же, как у вас.
Использование этого шаблона позволяет мне полностью отобразить отношения сущностей и не беспокоиться о получении дочерних сущностей в дао. В основном. В 90% случаев шаблон решает ленивые потребности инициализации в представлении. В некоторых случаях вам придется «вручную» инициализировать отношения. Эти случаи были редкими и всегда включали очень очень сложные отображения в моем случае.
При использовании Open Entity Manager в шаблоне View важно правильно определить отношения между сущностями и особенно параметры распространения и транзакции. Если они не настроены должным образом, будут возникать ошибки, связанные с закрытыми сеансами, когда какой-либо объект лениво инициализируется в представлении и происходит сбой из-за того, что сеанс уже закрыт.
Я бы определенно пошел с вариантом 1. Иногда может потребоваться вариант 2, но я не вижу абсолютно никакой причины использовать вариант 3. Вариант 4 также является «нет». Стремительная загрузка всего убивает производительность любого представления, которому нужно перечислить лишь несколько свойств некоторых родительских объектов (в данном случае это порядки).
N + 1 выбирает
Во время разработки будет N + 1 выбор в результате инициализации некоторых отношений в представлении. Но это не повод отказаться от паттерна. Просто исправьте эти проблемы по мере их возникновения и перед доставкой кода в производство. Устранить эти проблемы с помощью шаблона OEMIV так же легко, как и с любым другим шаблоном: добавить надлежащие методы dao или service, настроить контроллер на вызов другого метода поиска, возможно, добавить представление в базу данных и т. Д.