title: Cannot fetch LAZY - JPA
body: <p>I want to do LAZY loading in a OneToMany Relation in JPA.</p>
  
  <p>The Problem is, that when i want to acces the LAZY loaded Attribute i get a exception. I know that i have to be in a Transaction when trying to access the attribute. But it seems like the Transaction is not open. This is the exception:</p>
  
  <pre><code>org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.recipemanager.recipe.data.Recipe.ingredients, could not initialize proxy - no Session
          at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
          at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
          at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
          at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
          at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
          at de.recipemanager.recipe.web.IngredientDTOList.&lt;init&gt;(IngredientDTOList.java:27)
          at de.recipemanager.recipe.web.RecipeDTO.&lt;init&gt;(RecipeDTO.java:28)
          at de.recipemanager.recipe.web.RecipeDTOServiceImpl.get(RecipeDTOServiceImpl.java:22)
          at de.recipemanager.recipe.web.RecipeController.get(RecipeController.java:32)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:606)
          at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
          at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
          at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
          at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
          at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
          at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
          at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
          at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
          at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
          at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
          at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
          at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:594)
          at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1366)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
          at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
          at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:150)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:201)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
          at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
          at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
          at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
          at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1337)
          at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:484)
          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
          at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
          at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
          at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
          at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
          at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
          at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
          at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
          at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
          at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
          at org.eclipse.jetty.server.Server.handle(Server.java:351)
          at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
          at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)
          at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)
          at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634)
          at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
          at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
          at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)
          at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45)
          at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
          at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)
          at java.lang.Thread.run(Thread.java:724)
  2013-10-10 21:17:53.427:WARN:oejs.ServletHandler:/api/recipes/1
  org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.recipemanager.recipe.data.Recipe.ingredients, could not initialize proxy - no Session
          at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
          at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
          at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
          at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
          at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
          at de.recipemanager.recipe.web.IngredientDTOList.&lt;init&gt;(IngredientDTOList.java:27)
          at de.recipemanager.recipe.web.RecipeDTO.&lt;init&gt;(RecipeDTO.java:28)
          at de.recipemanager.recipe.web.RecipeDTOServiceImpl.get(RecipeDTOServiceImpl.java:22)
          at de.recipemanager.recipe.web.RecipeController.get(RecipeController.java:32)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:606)
          at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
          at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
          at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
          at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
          at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
          at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
          at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
          at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
          at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
          at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
          at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
          at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:594)
          at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1366)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
          at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
          at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:150)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:201)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
          at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
          at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
          at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
          at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
          at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1337)
          at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:484)
          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
          at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
          at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
          at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
          at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
          at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
          at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
          at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
          at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
          at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
          at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
          at org.eclipse.jetty.server.Server.handle(Server.java:351)
          at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
          at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)
          at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)
          at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634)
          at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
          at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
          at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)
          at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45)
          at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
          at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)
          at java.lang.Thread.run(Thread.java:724)
  </code></pre>
  
  <p>The Entity: </p>
  
  <pre><code>@Entity(name = "recipe")
  public class Recipe {
  
  @Id
  @GeneratedValue
  private Long id;
  
  private String name;
  
  private Integer duration;
  
  @Enumerated(EnumType.STRING)
  private Difficulty difficulty;
  
  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "recipe")
  List&lt;Ingredient&gt; ingredients;
  </code></pre>
  
  <p>The code where the exception is thrown:</p>
  
  <pre><code>@Service
  @Transactional
  public class RecipeServiceImpl implements RecipeService {
  private final RecipeRepository recipeRepository;
  
  @Autowired
  public RecipeServiceImpl(RecipeRepository recipeRepository) {
      this.recipeRepository = recipeRepository;
  }
  
  @Override
  public Recipe get(Long id) {
      Recipe recipe = recipeRepository.findOne(id);
      if(recipe == null) {
          throw new EntityNotFoundException("Recipe with id: " + id + " was not found.");
      }
      recipe.getIngredients();
      return recipe;
  }
  </code></pre>
  
  <p>And my Spring config:</p>
  
  <pre><code>@Configuration
  @ComponentScan(basePackages = "de.recipemanager")
  @EnableWebMvc
  public class ApplicationContext {
  }
  
  @Configuration
  @PropertySource("classpath:application.properties")
  @EnableJpaRepositories(basePackages = "de.recipemanager")
  @EnableTransactionManagement
  public class JPAContext {
  
      private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
      private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
      private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
      private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
  
      private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
      private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
      private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
      private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
      private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
      private static final String PROPERTY_NAME_HIBERNATE_AUTO = "hibernate.hbm2ddl.auto";
  
  
      @Resource
      private Environment environment;
  
      @Bean
      public DataSource dataSource() throws PropertyVetoException {
          ComboPooledDataSource dataSource = new ComboPooledDataSource();
          dataSource.setDriverClass(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
          dataSource.setJdbcUrl(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
          dataSource.setUser(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
          dataSource.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
  
          return dataSource;
      }
  
      @Bean
      public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException, PropertyVetoException {
          LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
  
          entityManagerFactoryBean.setDataSource(dataSource());
          entityManagerFactoryBean.setPackagesToScan(
                  environment.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
          entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
  
          Properties jpaProperties = new Properties();
          jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
          jpaProperties.put(PROPERTY_NAME_HIBERNATE_AUTO, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_AUTO));
          jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
          jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
          jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
  
          entityManagerFactoryBean.setJpaProperties(jpaProperties);
  
          return entityManagerFactoryBean;
      }
  
      @Bean
      public JpaTransactionManager transactionManager() throws ClassNotFoundException, PropertyVetoException {
          JpaTransactionManager transactionManager = new JpaTransactionManager();
  
          transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
  
          return transactionManager;
      }
  
  
  }
  </code></pre>
  
  <p>I hope someone can help my figure out the solution for my problem, and sorry for my bad english.</p>
  
  <h2>Solution</h2>
  
  <p>I could get it work by calling the size() attribute of the Ingredientslist.</p>
  
  <pre><code>@Service
  @Transactional
  public class RecipeServiceImpl implements RecipeService {
  
      private final RecipeRepository recipeRepository;
  
      @Autowired
      public RecipeServiceImpl(RecipeRepository recipeRepository) {
          this.recipeRepository = recipeRepository;
      }
  
      @Override
      public Recipe get(Long id) {
          Recipe recipe = recipeRepository.findOne(id);
          if(recipe == null) {
              throw new EntityNotFoundException("Recipe with id: " + id + " was not found.");
          }
          recipe.getIngredients().size(); //Needed to fetch the Ingredients in the open Transaction.
          return recipe;
      }
  </code></pre>