目前,我将实体bean中的集合标记为急于避免在使用EntityManager加载bean后尝试访问集合属性时出现延迟初始化异常。
如果我将集合保留为延迟加载,如何保持会话打开?我想过尝试@ transaction,但即使这样做有效,我也不想这么做,因为在一个长方法上打开一个事务似乎是不对的。
发布于 2009-07-16 20:27:02
https://www.hibernate.org/43.html
基本上,您有几个选择。
-You可以使用“在视图中打开会话”模式,在这种模式中,您可以使用过滤器/拦截器/面向方面编程风格的逻辑在服务器端逻辑开始时打开会话,并在会话结束时关闭会话。
-You可以实现跨越多个请求-响应周期的会话。
简单的老式Servlet过滤器是最简单的。
发布于 2009-07-24 15:06:34
最后一个选项似乎被忽略了,那就是你可以通过使用连接来基于你的用例来构建你的对象图。
这将导致对象被初始化,即不是代理。
如果您控制了客户端(即,您没有创建开放服务发布api),则可以使用此方法,因为您需要知道当会话由于事务已关闭而关闭时所触及的状态。
发布于 2009-07-17 08:14:22
正如其他人所说,您应该阅读“在视图中打开会话”模式,其基本思想是在处理http请求的整个持续时间内打开一个hibernate会话。有hibernate specific和spring两种解决方案--我以前用过spring,它工作得很好。
在问题中,您提到您不希望长时间打开事务。对于大多数人来说,这不是问题,因为每个请求都会得到相对较快的处理。但是,如果在您的情况下确实不可能,则此模式将不适用于您。你能详细解释一下为什么你不想让交易保持开放吗?
https://stackoverflow.com/questions/1139985
复制相似问题