Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
在Spring中使用WebSocket时如何避免LazyInitializationException?_Spring_Hibernate_Spring Mvc_Websocket_Stomp - Fatal编程技术网

在Spring中使用WebSocket时如何避免LazyInitializationException?

在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票,但看起

关于如何在以下设置中避免臭名昭著的LazyInitializationException(使用spring和hibernate)的任何建议:

怎么办

  • 用@Transactional注释doit()
  • 在用@Transactional注释的方法内计算结果
  • 手动执行OpenSessionInViewFilter为servlet请求执行的操作
  • 在Spring中为WebSocket使用某种类型的“即用”过滤器或拦截器(哪一种,如何使用,示例?)
  • Tomcat WebSocket过滤器

  • 现在我投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;
    }