Как подключиться к различным базам данных (разработка / тестирование / производство) прозрачно с Hibernate - PullRequest
4 голосов
/ 12 октября 2011

У меня есть несколько разных баз данных для разных сред, к которым я могу подключить свое приложение. Они постоянны для каждой установки, но различаются между ними. Другими словами, есть

  1. Среда разработки, которая подключается к базе данных разработки
  2. Тестовая среда, которая подключается к тестовой базе данных и, наконец,
  3. Производственная среда с собственной базой данных

Hibernate используется через аннотации, и код не «знает», в какой среде он запускается. Все базы данных управляются mySQL, но различаются по URL, имени пользователя и паролю.

В настоящее время я удалил hibernate.cfg.xml из приложения и переместил его в домашний каталог приложения-сервера-пользователя, но это не кажется очень хорошим решением по соображениям безопасности и потому, что это привело к необходимости обновлять вручную любые измененные сопоставления при обновлении среды.

Я действительно надеюсь, что есть лучшее решение, но я не могу его найти.

Ответы [ 4 ]

3 голосов
/ 12 октября 2011

Вы можете связать hibernate.cfg.xml в .jar или использовать вместо этого подход JPA (persistence.xml), который позволяет вам иметь различные «единицы постоянства», которые затем можно выбирать на основе любой переменной, которую вымне нравится (файл свойств в вашем доме, например).См. http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html#setup-configuration-packaging для примера файла persistence.xml.

3 голосов
/ 12 октября 2011

Используйте заполнители для URL, пользователя и пароля в файле конфигурации и замените эти заполнители фактическими значениями при создании приложения (используя ant, Maven или все, что вы используете для создания приложения). Сам процесс сборки может принимать эти значения из профиля (если используется Maven), либо из переменных среды, либо из аргументов командной строки.

Вам просто нужно собрать приложение три раза с разными параметрами: один раз для каждой целевой среды.

1 голос
/ 13 октября 2011

Вот как я это делаю.Мой файл конфигурации приложения

 <!-- 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 и т.д.1007 * и т. Д. / 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>

и т. Д.

1 голос
/ 12 октября 2011

Я думаю, что дело здесь не в том, чтобы перестроить приложение 3 раза.Я думаю, что вы можете использовать разные источники данных, которые будут определять разные URL вашего сервера базы данных в разных средах (dev / test / prod).Файл источника данных представляет собой XML-файл, который должен постоянно находиться в пределах вашего артефакта (ear / war или любого другого, что вы создаете).

Таким образом, вы всегда предоставляете одинаковые ear и разные файлы источника данных для разных сред

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...