Spring Bean为实体管理器初始化两次

时间:2014-10-16 16:19:01

标签: spring hibernate jpa

我的bean定义如下

 <bean id="batchManagementService" class="com.amdocs.dc.sprint.batch.service.BatchManagementServiceImpl" autowire-candidate="false">
     <property name="repository" ref="batchPersistenceRepository" />
     <property name="timeService" ref="batchTimeService" />     
     <property name="validator" ref="batchValidator" />
  </bean>

我在不同的模块中将这个bean引用到两个地方。 然而,它被初始化为两个不同的值。

  1. 使用执行正确数据库事务的JDK代理
  2. 与实现者类直接“BatchManagementServiceImpl”如上所述。 在第二种情况下,实体管理器返回null,导致所有数据库事务失败。
  3. implementsor类包含事务方法。 任何有关这方面的帮助将不胜感激..

1 个答案:

答案 0 :(得分:0)

对我来说描述不太清楚,但听起来你的applicationContext在模块中配置错误。 也许你尝试一下这样的方法: MODULE_A:   -applicationContextA.xml MODULE_B(应该使用MODULE_A的bean)   -applicationContextB.xml MODULE_C(应该使用MODULE_B和MODULE_A)   -applicationContextC.xml

错误方法是:

applicationContextA.xml:

<beans xmlns="http://www.springframework.org/schema/beans">
    ...
    <bean id="batchManagementService"...>

applicationContextB.xml:

<beans xmlns="http://www.springframework.org/schema/beans">
    <import resource="applicationContextA.xml"/>
    <bean id=anotherBean...

applicationContextC.xml:

<beans xmlns="http://www.springframework.org/schema/beans">
    <import resource="applicationContextB.xml"/>
    <bean id=anotherBean...

在这种情况下,当创建applicationContextC时,batchManagementService将被实例化两次。

试试这个: applicationContextA.xml:

<beans xmlns="http://www.springframework.org/schema/beans">
    ...
    <bean id="batchManagementService"...>

applicationContextB.xml:

<beans xmlns="http://www.springframework.org/schema/beans">
    <!--No import here! -->
    <!--<import resource="applicationContextA.xml"/>-->
    <bean id=anotherBean...

applicationContextC.xml:

<beans xmlns="http://www.springframework.org/schema/beans">
    <!-- No import here -->
    <!--<import resource="applicationContextB.xml"/>-->
    <bean id=anotherBean...

applicationContextFull.xml

<beans xmlns="http://www.springframework.org/schema/beans">
    <import resource="applicationContextA.xml"/>
    <import resource="applicationContextB.xml"/>
    <import resource="applicationContextC.xml"/>
 </beans>

,并尝试使用applicationContextFull.xml启动应用程序上下文。 希望这会有所帮助。