Лучший способ усечь все таблицы с Hibernate? - PullRequest
5 голосов
/ 26 ноября 2010

Я бы хотел обрезать все свои таблицы базы данных от одного интеграционного теста к другому. Каков наилучший способ сделать это с помощью Hibernate?

В настоящее время я делаю это:

public void cleanDatabase() {
        doWithSession(new Action1<Session>() {
            @Override
            public void doSomething(Session session) {
                SQLQuery query = session.createSQLQuery("truncate table stuff");
                // todo - generify this to all tables
                query.executeUpdate();
            }
        });

(doWithSession - это небольшая оболочка, которая создает и закрывает сеанс). Я мог бы перебрать все мои сопоставленные объекты, используя отражение ... Интересно, кто-нибудь уже решил эту проблему.

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

Я думаю, вы, вероятно, не используете Spring.Если бы вы это сделали, поддержка транзакционного тестирования Spring была бы идеальной.

Вкратце: Spring автоматически запускает транзакцию перед каждым тестовым случаем и автоматически откатывает ее после тестового случая, оставляя вас спустая (или, по крайней мере, неизменная) база данных.

Возможно, вы можете просто имитировать этот механизм:

Открыть транзакцию в методе @Before, откатить ее обратно в методе @After.

0 голосов
/ 26 ноября 2010

Вы можете использовать базу данных в памяти и отбросить всю базу данных между вашими тестами.

Вы можете использовать этот способ, если у вас не так много, но длительных тестов.

Но учтите, что каждая база данных ведет себя немного иначе, чем все остальные. Поэтому использование базы данных в памяти (например, HyperSQL) в некоторых случаях не будет вести себя точно так же, как ваша обычная база данных - поэтому это не правильный тест интеграции.

0 голосов
/ 26 ноября 2010

Вероятно, вы можете удалить и заново создать схему Hibernate, используя SchemaExport , хотя это кажется довольно сложным. Откат транзакции звучит как лучшая идея.

0 голосов
/ 26 ноября 2010

Вы смотрели в памяти mysql http://dev.mysql.com/downloads/connector/mxj/? и нет ли возможности отката после каждого теста? Я полагаю, что вы можете настроить его так.

...