繁体   English   中英

如何使用hibernate透明地连接到不同的数据库(开发/测试/生产)

[英]How to connect to different databases (development/test/production) transparently with hibernate

我有几个不同的数据库用于连接我的应用程序的不同环境。 这些是每个安装不变的,但它们之间有所不同 换句话说就是

  1. 连接到开发数据库的开发环境
  2. 最终连接到测试数据库的测试环境
  3. 生产环境有自己的数据库

Hibernate通过Annotations使用,代码不知道它运行的环境。所有数据库都是mySQL驱动的,但url,用户名和密码不同。

目前我从应用程序中删除了hibernate.cfg.xml并将其移动到application-server-user的主目录,但出于安全原因,这似乎不是一个非常好的解决方案,因为这引入了手动更新任何需要更新环境时更改了映射。

我真的希望,有一个更好的解决方案,但我找不到一个。

在配置文件中使用占位符作为url,user和password,并在构建应用程序时使用实际值替换这些占位符(使用ant,Maven或用于构建应用程序的任何内容)。 构建过程本身可以从配置文件(如果使用Maven),或从环境变量或命令行参数中获取这些值。

您只需要使用不同的参数构建应用程序三次:每个目标环境一次。

您可以将hibernate.cfg.xml捆绑在.jar中,或者您可以使用JPA(persistence.xml)方法,它允许您拥有不同的“持久性单元”,然后您可以根据您想要的任何变量进行选择(例如,您家中的属性文件)。 有关persistence.xml的示例,请参见http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html#setup-configuration-packaging

我认为这里的重点不是重建应用程序3次。 我认为您可以使用不同的数据源来定义不同环境(dev / test / prod)中数据库服务器的不同URL。 数据源文件是一个xml文件,应驻留在工件的外部(ear / war或您构建的任何内容)。

因此,您始终为不同的环境提供相同的耳朵和不同的数据源文件

我就是这样做的。 我的app-config文件

 <!-- Hibernate MySql SessionFactory -->
 <bean id="mySqlSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
      p:dataSource-ref="mySqlDataSource">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
   .....
        </props>
    </property>
    <property name="configLocation" value="WEB-INF/hibernate.cfg.xml"/>
</bean>

然后我在不同的属性文件中定义了这些变量,即etc / dev / pejl.properties ,etc / test / pejl.properties和etc / prod / pejl.properties

然后使用我的ant脚本构建开发...

<target name="deploydevwar" depends="build" description="Deploy application as a WAR file">
     <copy overwrite="true" todir="${web.dir}/WEB-INF/classes">
        <fileset dir="${etc.dir}/dev">
            <include name="*.properties" />               
        </fileset>
        </copy>
    <war destfile="${name}.war"
         webxml="${web.dir}/WEB-INF/web.xml">
        ...
   </war>
    <copy todir="${deploy.path}" preservelastmodified="true">
       .. 
    </copy>

     <copy overwrite="true" todir="${appserver.home}">
         ...
     </copy>            
</target>

用于测试..

<target name="deploytestwar" depends="build" description="Deploy application as a WAR file">
     <copy overwrite="true" todir="${web.dir}/WEB-INF/classes">
        <fileset dir="${etc.dir}/test">
            <include name="*.properties" />               
        </fileset>

等等..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM