настройка гибернации для производства и тестирования - PullRequest
2 голосов
/ 03 июля 2011

В своем веб-приложении я использую hibernate и hsqldb для операций с базами данных .. и использую Ant для управления сборкой. У меня есть local.properties, содержащие db.url, db.driver и т. Д. Они содержат производственные значения db.

В hibernate.cfg.xml я снова предоставляю эти параметры БД в качестве свойств внутри элементов SessionFactory.

В файле сборки Ant я использую local.properties в качестве файла свойств, чтобы я мог создатьцель для запуска db.

Наконец, в моей реализации dao я использую класс HibernateUtil для создания фабрики сессий. Теперь я могу получить доступ к myappdb.

Моя проблема в том, чтоМне нужно использовать другой БД для целей тестирования.У меня есть несколько классов тестирования junit и несколько тестов кактусов, которые должны работать на myapptestdb. В настоящее время я заменяю все параметры, связанные с БД, в local.properties и hibernate.cfg.xml на значения testdb.

т.е. замените myappdb на myapptestdb и т. д. Я знаю, это не правильный способ сделать это .. Кто-нибудь может предложить лучшее решение для этого?

заранее спасибо,

mark

Соответствующие части различных файлов конфигурации в моем проекте приведены ниже.

local.properties

   db.driver=org.hsqldb.jdbcDriver
    db.server.class=org.hsqldb.server.Server
    db.url=jdbc:hsqldb:hsql://localhost:9005/myappdb
    db.username=SA
    db.password=SA
    hport=9005
    dir.data=data
    halias=myappdb
    hjar=lib/hsqldb.jar
    hfile=--database.0 data/myappdb
   ...

hibernate.cfg.xml

<session-factory>
<property name="connection.driver_class">
    org.hsqldb.jdbcDriver
</property>
<property name="connection.url">
    jdbc:hsqldb:hsql://localhost:9005/myappdb;create=true
</property>
<property name="connection.username">SA</property>
<property name="connection.password">SA</property>
...
</session-factory>

build.xml

<property file="local.properties" />
...
<target name="startdb" description="start hsqldb in server mode">
        <java fork="true" classname="${db.server.class}"  >
            <classpath>
                <path location="${dir.lib}/hsqldb.jar"/>
            </classpath>
            <arg value="-database.0"/>
            <arg value="${dir.data}/${halias}"/>
            <arg value="-dbname.0"/>
            <arg value="${halias}"/>
            <arg value="-port"/>
            <arg value="${hport}"/>
        </java>
    </target>

MyDaoImpl.java

class MyDaoImpl implements MyDao {
    ...
    @Override
    public Object findById(Long id) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Object object = null;
        try {
            object = (Object) session.get(persistentClass, id);
            return object;
        } finally {
            session.close();
        }
    }
...
}

HibernateUtil.java

class HibernateUtil {
    private static SessionFactory sessionFactory;
    public static SessionFactory getSessionFactory() {      
        if (sessionFactory == null){
            try{
                Configuration configuration = new Configuration().configure();
                sessionFactory = configuration.buildSessionFactory();               
            }catch(HibernateException e){
                e.printStackTrace();
                throw e;
            }
        }

        return sessionFactory;
    }
}

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Два предложения:

1) Перейдите в Maven.Там вы можете определить <profiles/>, который позволит вам настроить параметры для различных сред (например, разработка, тестирование, интеграционное тестирование, производство).(Я не говорю, что вы не можете сделать это с Ant; но в Maven это намного естественнее и не требует много настроек).Вы также можете использовать фильтрацию ресурсов.Существует также разделение между рабочим и тестовым кодами, при этом вам не нужно делать гораздо больше, чем просто следовать соглашению.

2) В Ant вы можете иметь две отдельные копии файла свойств (расположенные в разных папках илипод разными именами) и выберите один для копирования под нужным вам именем, избегая необходимости программных изменений.Вы можете сделать это, передав свойство во время выполнения сборки.

1 голос
/ 04 июля 2011

@ markjason72: - несколько идей: - я) для муравья, почему вы думаете, что хранение БД в local.properties - плохая идея? Я думаю, что это правильный путь. Вы можете создать другую версию файлов свойств, таких как local_dev.properties, local_test1.properties, local_prod.properties. и ваш файл build.xml будет использоваться по-разному в зависимости от среды.

ii) В hibernate вы можете поделиться файлами свойств, настроенными выше для ant, и удалить эти свойства из файла hibernate.cfg.xml. Вы можете обратиться к конфигурации свойства гибернации для более подробной информации.

...