2014-01-22 2 views
4

Я использую Spring data, который прост в использовании, но я не могу его контролировать, потому что я получил ошибку тамотложенной загрузки с данными Spring

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: entity.Qualite.fonctions, could not initialize proxy - no Session 

FetchType.EAGER Я знаю, что будет работать, но я хочу сохранить его ленивым. так, как я могу контролировать сессию в spring data

@RequestMapping(value="/loadfonction") 
public @ResponseBody 
Set<Fonction> loadfonction(Map<String, Object> model, HttpServletRequest request) { 

    Set<Fonction> fonctions = qualiteRepo.findOne(Integer.valueOf(request.getParameter("idquality"))).getFonctions(); 

    System.out.println(fonctions.size()); 

    return fonctions; 


} 

Я даже попробовать @Transactional аннотацию, но это не сработало:

@Transactional 
@RequestMapping(value="/loadfonction") 

ответ

1

Вы не можете. Единственный способ избежать этой проблемы - сделать запрос, когда вы хотите получить объекты Fonction.

+0

невозможно с 'пружинными данными', а также если я перехожу в спящий режим, где я могу контролировать сеанс и транзакцию? – Youssef

+0

Я не уверен в этом, но, думаю, если вы находитесь в транзакции, вы можете вызвать какой-то метод для перезагрузки ленивой коллекции. Я кое-что прочитал об этом много времени назад, но я никогда не использовал его. – JCalcines

2

Это обычная проблема с попыткой открыть представление, используя фреймворк mvc spring. Метод управления закрывает сеанс до того, как его может отобразить представление. (Попытка сохранить представление из бизнес-логики) Чтобы обойти это, вы можете использовать класс OpenSessionInViewFilter.

Вот статья о том, как реализовать:

http://blog.cloudmate.pl/2010/09/hibernates-open-session-in-view-in.html

+0

проблема не в уровне представления. – Youssef

+0

Джимми прав, проблема вокруг ваших транзакционных границ. @Transactional должен находиться на вашем уровне обслуживания (бизнес-методы должны быть транзакционными, а не более мелкомасштабными методами DAO/Repository), и вам в идеале не следует подвергать объекты JPA за пределами уровня обслуживания (за пределами транзакционных/сеансовых границ). 'OpenSessionInViewFilter' является обходным путем для несовершенного дизайна. –

2

В репозитории вы не можете использовать методы запроса для инициализации коллекции. Вместо этого вы должны определить такой запрос, чтобы получить с ним коллекцию. Измените свой запрос в соответствии с вашим доменом, я не могу понять, как он должен искать вас.

@Query("SELECT q FROM Qualite q JOIN FETCH q.role WHERE q.fonctionId = (:fonctionId)") 
public Qualite findById(@Param("fonctionId") String fonctionId); 
Смежные вопросы