Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @可缓存终止休眠会话?_Java_Spring_Hibernate - Fatal编程技术网

Java @可缓存终止休眠会话?

Java @可缓存终止休眠会话?,java,spring,hibernate,Java,Spring,Hibernate,自从我在存储库方法上从@QueryHints切换到@Cacheable后,我遇到了一个问题 我有一个用Spring@Transactional注释的控制器方法,它调用一个服务方法(未注释)。 该服务首先使用repository.getByLogin(login)获取实体用户,然后在parent.getChildren()上循环 使用@Cacheable打开getByLogin(login),我在尝试执行parent.getChildren() 控制器(包含@Transactional,这是一种不

自从我在存储库方法上从
@QueryHints
切换到
@Cacheable
后,我遇到了一个问题

我有一个用Spring
@Transactional
注释的控制器方法,它调用一个服务方法(未注释)。 该服务首先使用
repository.getByLogin(login)
获取实体用户,然后在
parent.getChildren()上循环

使用
@Cacheable
打开
getByLogin(login)
,我在尝试执行
parent.getChildren()

控制器(包含
@Transactional
,这是一种不良做法):

@控制器
@请求映射(value=“/users”)
公共类用户控制器{
@自动连线
用户服务用户服务;
@交易的
@RequestMapping(value=“/add-son”,method=POST)
public void addSon(@RequestBody User-son){
userService.addSon(son);
}
}
服务:

@服务
公共类用户服务{
@自动连线
UserRepo存储库;
公共void addSon(用户子){
User parent=repository.getByLogin(User.getParent());//调用我的repo
对于(User-child:parent.getChildren()){//在此处中断
System.out.println(子项)
}
父母、子女(儿子);
}
}
我的旧存储库(已使用):

公共接口UserRepo扩展了JpaRepository{
@QueryHints({@QueryHint(name=COMMENT,value=“通过登录获取用户”),
@QueryHint(name=CACHEABLE,value=“true”)}
用户findByLogin(字符串登录);
}
我的新存储库(似乎终止了我的hibernate会话):

公共接口UserRepo扩展了JpaRepository{
@可缓存(value=“myapp.entities.User”,cacheManager=“springCacheManager”,除非=“#result==null”)
用户findByLogin(字符串登录);
}
堆栈跟踪:

org.hibernate.LazyInitializationException:未能延迟初始化角色集合:myapp.entities.User.children,无法初始化代理-无会话
位于org.hibernate.collection.internal.AbstractPersistentCollection.ThrowlazyiInitializationException(AbstractPersistentCollection.java:566)
位于org.hibernate.collection.internal.AbstractPersistentCollection.WithTemporarySessionIneed(AbstractPersistentCollection.java:186)
位于org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
位于org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
位于org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
位于myapp.services.UserService.addSon(UserService.java:19)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)
位于com.sun.proxy.$Proxy194.addSon(未知来源)
位于myapp.controllers.UserController.addSon(UserController.java:20)
在myapp.controllers.UserController$$FastClassBySpringCGLIB$$7053b110.invoke()中
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)上
位于org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:281)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
在myapp.controllers.UserController$$EnhancerBySpringCGLIB$$66ec522b.addSon()中
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中

当您为实体使用@Cacheable时,您的实体将添加到缓存中,而不会提取惰性集合。当您访问惰性集合时,它正在加载,但在此期间,会话可能已结束,无法加载惰性集合。 我将使用服务类,其中调用存储库并将实体转换为转换对象(加载惰性集合)。
然后,您将使用transform对象,因此您可以对服务方法@Cacheable进行注释。

LazyInitializedException在您退出事务并尝试使用代理执行CRUD时抛出。因此,我认为spring没有配置为在控制器中搜索@Transactional。还要确保已启用缓存:。顺便说一下:“我有一个用@Transactional注释的控制器。”。。别这样!糟糕的体系结构。这个项目的体系结构确实很糟糕:),但它与我的存储库中的
@QueryHints
配合得很好,因此事务在服务(@service bean)中传播得很好。很好
@Cacheable
@QueryHints
(用于缓存查询结果!)它们是完全不同的动物,有着完全不同的用途。Y