在Spring中使用WebSocket时如何避免LazyInitializationException?
关于如何在以下设置中避免臭名昭著的LazyInitializationException(使用spring和hibernate)的任何建议: 怎么办在Spring中使用WebSocket时如何避免LazyInitializationException?,spring,hibernate,spring-mvc,websocket,stomp,Spring,Hibernate,Spring Mvc,Websocket,Stomp,关于如何在以下设置中避免臭名昭著的LazyInitializationException(使用spring和hibernate)的任何建议: 怎么办 用@Transactional注释doit() 在用@Transactional注释的方法内计算结果 手动执行OpenSessionInViewFilter为servlet请求执行的操作 在Spring中为WebSocket使用某种类型的“即用”过滤器或拦截器(哪一种,如何使用,示例?) Tomcat WebSocket过滤器 现在我投3票,但看起
现在我投3票,但看起来很不酷…;-) 如果出现延迟初始化错误,则用于计算
结果的代码必须尝试访问尚未加载的内容。所以最大的问题是:计算是否需要访问卸载的数据?如果是这样,那么是的,您需要使doit
transactional。如果doit
不是事务性的,则2不会帮助您,因为当实体从加载返回时,它将被分离。所以1是你最好的选择。我也在为类似的问题挣扎。我认为这样做不应该是事务性的。你的服务应该是。但是您需要某种openSessionInView样式的过滤器来过滤WebSocket消息。我已经尝试过基于ChannelInterceptor编写我自己的代码,但迄今为止运气不佳。如果您遇到一个延迟初始化错误,那么您用于计算结果的代码必须尝试访问一些尚未加载的内容。所以最大的问题是:计算是否需要访问卸载的数据?如果是这样,那么是的,您需要使doit
transactional。如果doit
不是事务性的,则2不会帮助您,因为当实体从加载返回时,它将被分离。所以1是你最好的选择。我也在为类似的问题挣扎。我认为这样做不应该是事务性的。你的服务应该是。但是您需要某种openSessionInView样式的过滤器来过滤WebSocket消息。我试着写我自己的,基于ChannelInterceptor,但到目前为止没有运气
@MessageMapping("/activate/foo")
@SendToUser("/queue/result")
public Result doit(Integer fooId) {
Foo foo = fooService.load(fooId); // via hibernate
result = ... // accessing foo outside a hibernate transaction
// therefore a LazyInitializationException is thrown
return result;
}