0

我调用一个服务来加载一个实体。如果我在集成测试中运行它一切都很好,但在服务器上的现实生活中它会失败。

此实体中的某些属性是集合。在这两种情况下,实体都加载了 bean。当我在“query.getSingleResult()”附近使用断点在调试模式下停止执行时,我看到集合已加载。但只是在试运行...

我在 servletcontainer 中停止相同的代码并获得 InvocationException!?

我的环境看起来像:
spring 3.1
hibernate 3.6.6.Final

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

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.hoeso.gwt.platform.server.domain.common.Person.anschrift, no session or session was closed at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122) at org.hibernate.collection.PersistentBag.size(PersistentBag.java:248) at de.hoeso.sis.server.services.common.impl.UserServiceBeanImpl.login(UserServiceBeanImpl.java:397) at de.hoeso.sis.server.rpc.LoginService.execute(LoginService.java:35)

我发现,在测试模式下,休眠会话已连接并打开。在生产模式下(在 servletcontainer 中,没有通过entitymanager.getDelegate().

4

1 回答 1

0

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

在我在加载对象的代码附近放置一个断点后,我看到了主要区别。

return entitymanager.isOpen();

(boolean) true // 测试模式和生产模式

return ((org.hibernate.Session)entitymanager.getDelegate()).isConnected();

(boolean) true // 在测试模式 (boolean) false // 在生产模式

return ((org.hibernate.Session)entitymanager.getDelegate()).isOpen();

(boolean) true // 在测试模式 (boolean) false // 在生产模式

return((org.hibernate.Session)entitymanager.getDelegate()).getTransaction().isActive();  

在生产模式中这会抛出一个异常在测试模式中返回:(布尔值)真

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

注释已插入,一切正常!

于 2012-06-08T12:14:32.967 回答