2015-02-27 3 views
1

Я сейчас в процессе преобразования большого проекта из Grails в Spring: я несколько застреваю при попытке lazy-load id объектов без необходимости выбирать всю таблицу.Spring, Hibernate, JPA: Lazy id загрузки

Как я хотел бы, чтобы работать, /Object/:

Object 
    List<child> children 

будет выводиться следующим образом:

{children:[{id:1},{id:2}]} 

, так что с другого контроллера, то я могу получить доступ, что внутренний объект, если требуется, используя регулярные методы CRUD, которые я реализовал во всех моих контроллерах. /child/1

С выходом JSON в виде, у меня возникают проблемы с не сессиями будучи доступны во время сериализации что вполне понятно, что я видел такие методы, как вызов object.child.getId() в слое сервиса кажется невероятно Hacky ко мне и хотел бы также привести к весь объект должен быть лениво загружен.

В целом, я ищу, чтобы создать простую Rest приложение с легкой настройки выходного сигнала JSon, что-то Grails сделал с плагином JSON сортировочной действительно неплохо: https://grails.org/plugin/marshallers

Edit: Я не хочу для установки желаемой загрузки, но явная загрузка возможна. Есть ли способ получить Eager Loading с максимальной глубиной?

{ 
    children: { //depth 1 
       children-children: { //depth 2 (Ignore this) 
       } 
      } 
} 

ответ

0

Вы можете либо использовать (это в основном обертка для object.child.getId взломать):

Hibernate.initialize(object.getChildren()); 

Или создать специальный запрос для этого (это было бы жадная загрузка с максимальной глубиной 1):

#assuming you use hql, it would look like this 
SELECT e FROM Entity e 
    JOIN FETCH e.children... 

Возможно также с CriteriaAPI и DetachedCriteria.

0

Вы можете использовать @Fetch(FetchMode.SUBSELECT), чтобы все неинициализированные объекты извлекались с помощью одного вторичного запроса при доступе.

Вам остается только убедиться, что сеанс Hibernate все еще открыт, когда доступ к неинициализированной ассоциации LAZY.