Spring jpa lazyloading在生产模式下失败-在测试模式下工作正常

Spring jpa lazyloading在生产模式下失败-在测试模式下工作正常,spring,hibernate,jpa,Spring,Hibernate,Jpa,我调用一个服务来加载一个实体。如果我在integrationtest中运行它,这一切都很好,但是在服务器上的实际应用中它失败了 此实体中的某些属性是集合。实体在这两种情况下都加载了bean。当我在debugmode中停止执行时,在query.getSingleResult附近有一个断点,我看到集合已加载。但只有在测试运行中 我在servletcontainer中停止相同的代码,并得到一个调用异常 我的环境看起来像: 春季3.1 hibernate 3.6.6.4最终版本 我尝试过的事情: -搜索

我调用一个服务来加载一个实体。如果我在integrationtest中运行它,这一切都很好,但是在服务器上的实际应用中它失败了

此实体中的某些属性是集合。实体在这两种情况下都加载了bean。当我在debugmode中停止执行时,在query.getSingleResult附近有一个断点,我看到集合已加载。但只有在测试运行中

我在servletcontainer中停止相同的代码,并得到一个调用异常

我的环境看起来像: 春季3.1 hibernate 3.6.6.4最终版本

我尝试过的事情: -搜索context.xml测试和生产中的差异 -在productionmode中使用其他context.xml文件测试

return ((org.hibernate.Session)entitymanager.getDelegate()).isConnected();
return ((org.hibernate.Session)entitymanager.getDelegate()).isOpen();
return((org.hibernate.Session)entitymanager.getDelegate()).getTransaction().isActive();  
org.hibernate.LazyInitializationException:未能延迟初始化角色集合:de.hoeso.gwt.platform.server.domain.common.Person.anschrift,未关闭任何会话或会话 位于org.hibernate.collection.AbstractPersistentCollection.ThrowlazyiInitializationExceptionAbstractPersistentCollection.java:383 位于org.hibernate.collection.AbstractPersistentCollection.ThrowlazyiInitializationExceptionIfNotConnectedAbstractPersistentCollection.java:375 位于org.hibernate.collection.AbstractPersistentCollection.ReadSizeAstractPersistentCollection.java:122 位于org.hibernate.collection.PersistentBag.sizePersistentBag.java:248 位于de.hoeso.sis.server.services.common.impl.UserServiceBeanImpl.loginUserServiceBeanImpl.java:397 位于de.hoeso.sis.server.rpc.LoginService.executeLoginService.java:35


我发现,在testmode中,hibernate会话已连接并打开。在servletcontainer的productionmode中,没有可通过entitymanager.getDelegate连接的hibernatesession。

现在我在JMelnik的帮助下找到了自己问题的解决方案。为了子孙后代,我将分享我的解决方案

在我将断点放在加载对象的代码附近之后,我看到了主要的区别

return entitymanager.isOpen();
布尔true//testmode和productionmode

return ((org.hibernate.Session)entitymanager.getDelegate()).isConnected();
return ((org.hibernate.Session)entitymanager.getDelegate()).isOpen();
return((org.hibernate.Session)entitymanager.getDelegate()).getTransaction().isActive();  
testmode中的布尔true// productionmode中的布尔值false//

return ((org.hibernate.Session)entitymanager.getDelegate()).isConnected();
return ((org.hibernate.Session)entitymanager.getDelegate()).isOpen();
return((org.hibernate.Session)entitymanager.getDelegate()).getTransaction().isActive();  
testmode中的布尔true// productionmode中的布尔值false//

return ((org.hibernate.Session)entitymanager.getDelegate()).isConnected();
return ((org.hibernate.Session)entitymanager.getDelegate()).isOpen();
return((org.hibernate.Session)entitymanager.getDelegate()).getTransaction().isActive();  
在productionmode中,这会引发异常 在testmode中,返回:boolean true

结论:代码在生产模式下运行,没有事务。在测试模式中,存在一个事务,因为测试类继承自一个超类,该超类用@Transactional注释。在ServiceBean的层次结构中,我忘记了这一点


插入注释后,一切都完美无瑕

您的测试方法是否在事务中加载子项?并获取InvocationException为InvocationException添加堆栈跟踪副本可能有助于回答您的问题。测试bean配置和生产bean配置之间有什么区别?@JMelnik:这是同一个事务。我加载了实体,下一行代码得到了这个错误。@Raedwald:这两种配置之间没有区别。正如我所说的:我已经准备好在生产中使用testContext.xml了,但也失败了。那么,上下文是不同的吗?在测试上下文中它可以工作,而在servlet中它不能工作?恭喜你!当你有能力时,请确保将你的答案标记为“已接受”,以便其他人能够从你的成功中学习。干杯~