我正在使用Spring data
这很容易使用但我无法控制它,因为我在那里遇到错误
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")
答案 0 :(得分:2)
尝试使用spring mvc框架打开视图时,这是一个常见问题。控制方法在视图可以显示之前关闭会话。 (试图将视图保持在业务逻辑之外)要解决它,可以使用OpenSessionInViewFilter类。
这是一篇关于如何实现它的文章:
http://blog.cloudmate.pl/2010/09/hibernates-open-session-in-view-in.html
答案 1 :(得分:2)
在您的存储库中,您无法使用查询方法来初始化集合。相反,你应该定义一个类似的查询来获取它的集合。根据您的域名更改您的查询,我无法弄清楚它应该如何找到您。
@Query("SELECT q FROM Qualite q JOIN FETCH q.role WHERE q.fonctionId = (:fonctionId)")
public Qualite findById(@Param("fonctionId") String fonctionId);
答案 2 :(得分:1)
你做不到。避免此问题的唯一方法是在要检索Fonction
对象时执行查询。