2009-09-28 74 views
3

在我的applicationContext里面,我有2个dao。如果我指定我的第二道以下使用flushmode,我将得到错误无效;嵌套的异常是org.xml.sax.SAXParseException:类型ID的属性值“org.springframework.orm.hibernate3.HibernateAccessor.FLUSH_COMMIT”在文档中必须是唯一的。另一方面,当我排除2nd dao的flushmode时,没有错误。任何人都可以解释一下吗?flushmode只能使用一次?

<bean id="dao" class="info.jtrac.hibernate.HibernateJtracDao" init-method="createSchema"> 
     <property name="hibernateTemplate"> 
      <bean class="org.springframework.orm.hibernate3.HibernateTemplate"> 
       <property name="sessionFactory" ref="sessionFactory"/> 
       <property name="flushMode"> 
        <bean id="org.springframework.orm.hibernate3.HibernateAccessor.FLUSH_COMMIT" 
         class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>      
       </property> 
      </bean> 
     </property>   

    </bean> 


    <bean id="secondsdao" class="com.company.secondSHibernateDao" > 
     <property name="hibernateTemplate"> 
      <bean class="org.springframework.orm.hibernate3.HibernateTemplate"> 
       <property name="sessionFactory" ref="secondSsessionFactory"/> 
       <property name="flushMode"> 
        <bean id="org.springframework.orm.hibernate3.HibernateAccessor.FLUSH_COMMIT" 
         class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>      
       </property> 

      </bean> 
     </property> 

    </bean> 

回答

1

这是很容易被作为字符串值提供适当的常量配置刷新模式:

<bean class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory" ref="secondSsessionFactory"/> 
    <property name="flushModeName" value="FLUSH_COMMIT" /> 
</bean> 

但是,如果你宁愿检索恒定在HibernateAccessor定义的值,你需要通过指定字段的名称你检索为staticField属性来配置FieldRetrievingFactoryBean正确:

<bean class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory" ref="secondSsessionFactory"/> 
    <property name="flushMode"> 
    <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> 
     <property name="staticField" value="org.springframework.orm.hibernate3.HibernateAccessor.FLUSH_COMMIT"/> 
    </bean> 
    </property> 
</bean> 

Bean id是完全不同的东西;它用于在应用程序上下文中唯一标识bean,正如Arthur指出的那样,可以省略内部bean。

+0

我使用了第二种技术,概述它的工作原理。我可否知道我需要在任何java文件中创建“staticField”? – cometta 2009-09-29 04:31:32

+0

“staticField”告诉FieldRetrievingFactoryBean获取指定的任何属性的值,在本例中为HibernateAccessor的FLUSH_COMMIT。所以不,你不需要创造任何东西。 – ChssPly76 2009-09-29 05:12:47

1

只需从两个flushMode属性中删除id属性即可。

<property name="flushMode"> 
    <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/> 
</property> 

建议:您不能在多个元素中使用相同的id属性。

问候,