我有一个看起来像这样的错误:
无法初始化代理-没有会话
我正在使用java,hibernate和spring。尝试生成PDF文档时会出现此错误,我正在按照以下步骤即时生成它并存储在数据库中。
我通过POST方法向应用发送了请求。这将即时生成PDF并显示给用户。
在该请求之后,我发送了另一个请求,但是通过ajax发送了一个请求。这将生成相同的PDF,但会将其保存在数据库中。
该错误表明由于“无法初始化代理-没有会话”错误而无法执行查询。
我在做错什么,在同一用户会话中两次调用相同的方法吗?可能是在两个请求都完成之前会话已关闭吗?
希望有人可以帮助我了解正在发生的事情。
您的问题是hibernate会话仅可用于一个请求。它在请求的开始处打开,并在结束时关闭。您猜中了答案:在两个请求都完成之前,hibernate会话已关闭。
到底是怎么回事?您的实体对象在两个请求期间均有效。怎么样?它们存储在HTTP会话中(这与会话不同),您不会提供有关正在使用的框架的太多信息,因此我无法为您提供更多详细信息,但是可以确定您正在使用的框架以某种方式将您的实体保留在HTTP会话中。这样,该框架使您可以轻松地针对多个请求使用相同的对象。
当第二个请求的处理开始时,代码正在尝试访问某些由hibernate延迟初始化的实体(通常是集合的元素)。该实体未附加到hibernate会话,因此hibernate无法在读取之前初始化hibernate代理。您应该打开一个会话,然后在ajax请求处理开始时将您的实体重新连接到该会话。
编辑:
我将尝试简要说明幕后发生的事情。所有Java
Web框架都有一个或多个处理请求的servlet。Servlet通过创建一个新线程来处理每个请求(HttpRequest),该线程最终将产生响应(HttpResponse)。处理每个请求的方法在此线程内执行。
在请求处理开始时,您的应用程序应分配其处理所需的资源(事务,hibernate会话等)。在处理周期结束时,将释放这些资源(提交事务,关闭hibernate会话,释放JDBC连接等)。这些资源的生命周期可以由您的框架管理,也可以由您的代码完成。
为了支持无状态协议(如HTTP)中的应用程序状态,我们有HttpSession对象。我们(或框架)将HttpSession上保持相同客户端不同请求周期之间相关信息的信息放到了HttpSession上。
在处理第一个请求期间,hibernate模式从数据库中懒惰地读取一个实体。由于延迟初始化,该对象结构的某些部分是hibernate代理对象。这些对象与创建它们的hibernate会话相关联。
当您尝试处理第二个请求时,框架会从HttpSession对象中的上一个请求中找到实体。然后,它尝试从延迟初始化的子实体访问属性,而该子实体现在是hibernate代理对象。hibernate代理对象是对真实对象的模仿,当有人尝试访问其属性之一时,它将请求其hibernate会话用数据库中的信息填充它。这是您的hibernate代理正在尝试执行的操作。但是它的会话在之前的请求处理结束时已关闭,因此现在没有hibernate会话可用于充水(填充有真实信息)。
请注意,您可能已经在第二个请求的开头打开了一个hibernate会话,但是它不知道包含代理对象的实体,因为该实体是由另一个hibernate会话读取的。您应该将实体重新连接到新的hibernate会话。
关于如何重新附加独立实体的讨论很多,但目前最简单的方法是session.update(entity)
。
希望能帮助到你。
问题内容: 我有2台物理服务器,我的Web应用程序命中该服务器由负载均衡器管理。我总是得到- org.hibernate.LazyInitializationException:无法初始化代理-没有会话 当其中一台服务器受到攻击而另一台服务器运行平稳而没有任何问题时。我有一个由应用程序启用和管理的本地托管缓存存储。仅当尝试从一个表访问一个特定的列时,才会发生此异常。不管选择哪个服务器,其余的操作都
问题内容: 我的代码检索与用户有关的所有信息: 在简单地返回一组用户的ES。 我的问题是:即使会话已经关闭,为什么对象仍然具有其值(例如名称)?是该类的实例变量。但是为什么我不能检索其值却可以检索该类的常规实例变量? 是一个。 问题答案: 有关使用惰性关联的hibernate文档清楚地将这种访问称为错误。只有在会话仍处于打开状态时,才能与延迟关联的对象进行交互。文档的该部分还提供了访问对象的延迟关
问题内容: 对数据库有以下查询: 在获取employee.address.street,employee.address.houseNumber或employee.address.city时,它将失败,但以下情况除外: 员工映射: 地址映射: 对于其他类(办公室,公司等),这是绝对正常的。如果注释,则在jsp应用程序中加载地址字段的行将正常工作。怎么了?顺便说一下,尽管有异常,它仍显示有关js
问题内容: 我试图从数据库中的对象进行简单加载,但出现错误“无法初始化代理-没有会话”,知道吗?谢谢 问题答案: 尝试添加到validate方法: 发生的事情是,因为没有注释,所以没有与该方法关联的会话,并且每个查询都将在其自己的会话中运行,该会话随后将立即关闭。 该方法始终返回一个代理,与之不同(请参阅此处,了解load与get之间的差异)。 因此,返回了代理,但是由于缺少代理,因此立即关闭了创
我尝试通过WebService从我的数据库中获取数据列表。我用spring和冬眠我读过这样或这样的主题 所以我试着把一些事务放在类的顶部,在我的方法上,等等,但是不起作用,或者我没有用正确的参数把正确的东西放在正确的地方。 谢谢,如果语法不好,请原谅 编辑:我想问题是来自我的类Personne在懒惰模式下得到了与许多其他实体的链接,这是否意味着在web服务上说,当我返回对象时,我不关心这个链接?或
我试图从DB中的一个对象做一个简单的加载,但是我得到的错误是“Could not initialize proxy-no session”,有什么想法吗?谢谢