项目包括 EJB 2.0 和 EJB 3.0 Bean。我将会话bean 从EJB 2.0转换为EJB 3.0,当我启动项目时,它多次初始化会话bean。会话bean调用其他会话bean,后者又调用此会话bean的不同方法。只要它是EJB 2.0会话bean,只初始化了一个实例,但现在初始化了多个实例。
UtilitiesController 会话Bean启动一个调用杂项类(帮助程序类POJO)的线程,该线程返回调用 ProductScheme 会话Bean,调用 ServerGlobalValues (帮助程序类POJO)并调用 UtilitiesController 会话Bean
以下是日志:
setSessionContext被调用!
setSessionContext被调用!
@PostConstruct方法被调用!
开始初始化
< 2013-06-07 15:03:53.535 - ServerSession(316201757) - EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
< 2013-06-07 15:03:53.535 - ServerSession(316201757) - 服务器:10.3.5.0>
setSessionContext被调用!
setSessionContext被调用!
@PostConstruct方法被调用!
开始初始化
< 2013-06-07 15:03:53.691 - ServerSession(316201757) - DatabaseSession有一个由ServerPlatform以外的东西定义的外部事务控制器。 EclipseLink将允许覆盖外部事务控制器,但我们建议您考虑替代子类org.eclipse.persistence.platform.server.ServerPlatformBase并覆盖getExternalTransactionControllerClass()。>
< 2013-06-07 15:03:53.691 - ServerSession(316201757) - EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
< 2013-06-07 15:03:53.691 - ServerSession(316201757) - 服务器:10.3.5.0>
setSessionContext被调用!
setSessionContext被调用!
@PostConstruct方法被调用!
开始初始化
< 2013-06-07 15:03:53.722 - ServerSession(316201757) - DatabaseSession有一个由ServerPlatform以外的东西定义的外部事务控制器。 EclipseLink将允许覆盖外部事务控制器,但我们建议您考虑替代子类org.eclipse.persistence.platform.server.ServerPlatformBase并覆盖getExternalTransactionControllerClass()。>
< 2013-06-07 15:03:53.722 - ServerSession(316201757) - EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
< 2013-06-07 15:03:53.722 - ServerSession(316201757) - 服务器:10.3.5.0>
setSessionContext被调用!
setSessionContext被调用!
@PostConstruct方法被调用!
开始初始化
< 2013-06-07 15:03:53.847 - ServerSession(316201757) - DatabaseSession有一个由ServerPlatform以外的东西定义的外部事务控制器。 EclipseLink将允许覆盖外部事务控制器,但我们建议您考虑替代子类org.eclipse.persistence.platform.server.ServerPlatformBase并覆盖getExternalTransactionControllerClass()。>
< 2013-06-07 15:03:53.847 - ServerSession(316201757) - EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
< 2013-06-07 15:03:53.847 - ServerSession(316201757) - 服务器:10.3.5.0>
setSessionContext被调用!
setSessionContext被调用!
@PostConstruct方法被调用!
开始初始化
< 2013-06-07 15:03:53.879 - ServerSession(316201757) - DatabaseSession有一个外部事务控制器,由ServerPlatform以外的东西定义。 EclipseLink将允许覆盖外部事务控制器,但我们建议您考虑替代子类org.eclipse.persistence.platform.server.ServerPlatformBase并覆盖getExternalTransactionControllerClass()。>
< 2013-06-07 15:03:53.879 - ServerSession(316201757) - EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
< 2013-06-07 15:03:53.879 - ServerSession(316201757) - 服务器:10.3.5.0>
javax.ejb.EJBTransactionRolledbackException:EJB异常:;嵌套异常是:Exception [EclipseLink-8030](Eclipse Persistence Services - 2.1.3.v20110304-r9073):org.eclipse.persistence.exceptions.JPQLException
从日志中可以看出,每次创建实例时都会调用setSessionContext两次,并且在初始化之前也会调用@PostConstruct方法。
任何人都可以指出这种行为背后的原因。是否缺少任何配置?
答案 0 :(得分:0)
我忘了提到辅助类(即Miscellaneous Class& ServerGlobalValues)是单例,单例类的行为是意外的。我发现多个实例的原因与调用helper类的getInstance()有关。如果我在PostConstruct中调用getInstance(),我会看到辅助类和控制器的多个实例,但是将它移到类级别可以解决多个实例问题。