【问题标题】:flushmode can only used one time?flushmode 只能使用一次?
【发布时间】:2009-09-28 06:37:25
【问题描述】:

在我的 applicationContext 中,我有 2 个 dao 。如果我将下面的第二个 dao 指定为使用刷新模式,我将收到错误 invalid;嵌套异常是 org.xml.sax.SAXParseException:类型 ID 的属性值“org.springframework.orm.hibernate3.HibernateAccessor.FLUSH_COMMIT”在文档中必须是唯一的。另一方面,当我排除第二道的冲洗模式时,没有错误。谁能解释一下?

   <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>

【问题讨论】:

    标签: hibernate spring spring-mvc


    【解决方案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,可以省略它。

    【讨论】:

    • 我使用了您概述的第二种技术并且它有效。我可以知道我需要在任何 java 文件中创建“staticField”吗?
    • "staticField" 告诉 FieldRetrievingFactoryBean 获取指定属性的值 - 在本例中为 HibernateAccessorFLUSH_COMMIT。所以不,你不需要创建任何东西。
    【解决方案2】:

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

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

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

    问候,

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多