2014-11-23 43 views
0

我正在处理一个处理书店的小型maven(多模块)项目。我目前有当加载懒洋洋实体Spring @Transactional在延迟加载时不工作

用户的收集问题

有订单的集合,这是延迟加载。

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: edu.flst.bookstore.domaine.bo.User.orders, could not initialize proxy - no Session 
org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566) 
org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186) 
org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:137) 
org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:242) 
org.dozer.MappingProcessor.prepareDestinationList(MappingProcessor.java:881) 
org.dozer.MappingProcessor.addOrUpdateToList(MappingProcessor.java:806) 
org.dozer.MappingProcessor.addOrUpdateToList(MappingProcessor.java:894) 
org.dozer.MappingProcessor.mapListToList(MappingProcessor.java:730) 
org.dozer.MappingProcessor.mapCollection(MappingProcessor.java:580) 
org.dozer.MappingProcessor.mapOrRecurseObject(MappingProcessor.java:453) 
org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:361) 
org.dozer.MappingProcessor.mapField(MappingProcessor.java:307) 
org.dozer.MappingProcessor.map(MappingProcessor.java:267) 
org.dozer.MappingProcessor.mapToDestObject(MappingProcessor.java:216) 
org.dozer.MappingProcessor.createByCreationDirectiveAndMap(MappingProcessor.java:196) 
org.dozer.MappingProcessor.mapGeneral(MappingProcessor.java:170) 
org.dozer.MappingProcessor.map(MappingProcessor.java:104) 
org.dozer.MappingProcessor.map(MappingProcessor.java:99) 
org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:120) 
edu.flst.bookstore.transverse.utils.mapper.MapperUtils.map(MapperUtils.java:30) 
edu.flst.bookstore.service.impl.UserServiceImpl.rechercher(UserServiceImpl.java:26) 
edu.flst.bookstore.presentation.controller.HomeController.index(HomeController.java:20) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:483) 
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 

我目前使用的是Tomcat,因此我无法添加JTA事务。

我用Spring的JPA事务管理器来处理事务。

<!-- ============================= --> 
<!-- TRANSACTION MANAGER   --> 
<!-- ============================= --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

这个bean在我的持久层spring的上下文文件中。

我已经添加了@Transactional注解到我的抽象服务(我的所有服务扩展此类)

@Service 
@Transactional 
public abstract class AbstractServiceImpl { 

    @Autowired protected UserRepository userRepository; 

    @Autowired protected OrderRepository orderRepository; 

    @Autowired protected BookRepository bookRepository; 

    @Autowired protected Mapper mapperService; 

} 

它实际上是行不通的。我尝试在我的存储库接口中设置注释(我使用Spring数据JPA),但它也不起作用。

+0

向我们展示如何在您的HomeController中获得UserServiceImpl的实例。还要确保你的配置文件中有。 – 2014-11-23 18:01:38

回答

0

如果您检索包含惰性引用的实体,并且在您已经离开事务上下文时第一次将其解除引用,则通常会出现此问题。由于没有从数据库中检索到引用,因此无法引用解引用。 AFAIK有三种解决方案,这一问题:

  • 用渴望获取从数据库中得到的一切
  • 在你的数据库访问层获取必要的延迟引用,以使其可被保持
  • 使用持久交易即使在实际的数据库访问层之后仍然打开