我可以注入一个休眠配置吗?

时间:2014-07-25 20:54:26

标签: xml spring hibernate dependency-injection

我对Spring注入和Web服务的世界还很陌生。到目前为止,我已经开发了一些简单的SOAP和REST服务,使用属性文件将依赖于已部署服务器(DEV v.QA v.PROD)的变量(例如用户名和密码)注入到bean中。现在我们尝试使用VisualParadigm工具自动生成代码的数据库部分。突然我发现用户名/密码/等。数据库的值不在applicationContext.xml文件中,而是位于src / main / java / ormmapping目录中的project.cfg.xml文件中。内容:

<hibernate-configuration>
<session-factory>
<!-- properties -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/customer</property>
    <property name="connection.username">{database.username}</property>
    <property name="connection.password">{database.password}</property>
    <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.acquire_increment">1</property>
    <property name="hibernate.c3p0.idle_test_period">0</property>
    <property name="hibernate.c3p0.min_size">1</property>
    <property name="hibernate.c3p0.max_size">15</property>
    <property name="hibernate.c3p0.timeout">0</property>
    <property name="show_sql">false</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <!-- mapping files -->
</session-factory>
</hibernate-configuration>

我在哪里看到xml元素

<property name="connection.username">root</property>

我尝试用$ {database.username}替换root,后者引用我指定的.properties文件中的属性。日志的结果是用户名现在设置为null。

我正在使用CXF和Maven。我相信一定要找到属性文件;我可以从STS控制台看到它从同一目录加载log4j.xml,它们都是从web.xml引用的。有没有办法将project.cfg.xml中的值从硬编码更改为注入? [该文件是由VP提供的.jar文件引用的,它将VP生成的代码与hibernate代码连接起来。我希望不必修改这样的供应商提供的库。]

2 个答案:

答案 0 :(得分:2)

一种可能的解决方案是将hibernate配置移动到spring,在那里你可以使用属性,就像你用于其他常规spring bean一样。以下示例取自documentation

<beans>

  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
    <property name="username" value="${database.username}"/>
    <property name="password" value="${database.password}"/>
  </bean>

  <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
  </bean>

</beans>

答案 1 :(得分:1)

一个简单的解决方案是从外部文件导入部署变量。我无法让XInclude工作;由于hibernate.cfg.xml文件是由DTD规范控制的,因此<xi:include>行的任何添加都必须符合规范&#39;错误,我无法弄清楚是否允许我正确修改DTD。但是,使用ENTITY替换工作。在DOCTYPE声明中,添加ENTITY以指定外部文件:

   <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"
[ <!ENTITY xinclude SYSTEM "/etc/comporium/com.comporium.customermodel.webservices/hibernate.xml"> ]> 

然后用一个&xinclude; -

替换所需的元素
   <hibernate-configuration>
    <session-factory>
    <!-- properties -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        &xinclude;
        <property name="show_sql">false</property>
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
        <!-- mapping files -->
    </session-factory>
</hibernate-configuration>

然后将正确的部署文件放在/ etc目录中。它不是“格式良好”。 xml,没有开放元素 - 它只包含<property>个元素。