2015-01-28 2 views
1

Я изучил миграцию flywaydb с помощью java-работ с подключением JDBC, а также поддержку весов через SpringTemplate, но пролетная дорога не работает с DAO.Миграция пролетного пути с java

для таблиц/сущностей с большим количеством связей, это делает жизнь намного легче выполнять миграцию с помощью DAO, а не sql.

Есть ли решение или обход для решения этой проблемы?

+0

Что вы подразумеваете под «flyway не работает с DAOs»? –

+0

Заинтересованы, если миграция DML может быть выполнена с использованием уровня «Службы» и «Стойкость», с задействованным пролетом. –

ответ

1

Во-первых, Flyway имеет собственную систему управления транзакциями и не использует обработку транзакций Spring.

Если объекты DAO продлить JdbcDaoSupport, вы можете создать экземпляр вручную вашего DAO, а затем вручную вводить при условии JdbcTemplate в DAO:

public class MyJdbcMigration implements SpringJdbcMigration { 
    public void migrate(JdbcTemplate jdbcTemplate) { 
    MyJdbcDao dao = new MyJdbcDao(); 
    dao.setJdbcTemplate(jdbcTemplate); 
    dao.updateDate(); 
    } 
} 
0

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

+0

Я ищу способ миграции с использованием кода бизнес-логики, есть ли какой-либо ссылочный пример того, как выполнять собственный распознаватель миграции или исполнитель, я хочу, чтобы исполнитель реализовал ApplicationContextAware, чтобы найти мои DAO и ресурсы в коде миграции пролета. –

0

Я знаю, это приходит очень поздно, но и для будущих посетителей с той же проблемой это может быть полезно.

Создатель Flyway (Axel Fontaine) на самом деле не прав в этом вопросе. Прекрасно переносить данные с помощью бизнес-логики, и нет проблемы с курицей и яйцом, если вы не меняете структуру базы данных в сценарии обновления.

Один из примеров: у вас есть поле «пароль» в вашей базе данных, и это чистый текст. Из-за проблем с безопасностью теперь вы хотите использовать специальную хеш-функцию и хешировать все пароли в базе данных (она должна быть защищенной, а база данных не имеет функции для этого). Хеш-функция объявляется в вашем UserDAO и вызывается при создании пользователя или при изменении пароля. Хотя это не прекрасный пример, существует множество возможных сценариев, когда доступ к DAO для миграции имеет смысл.

К счастью, мой коллега по работе нашел решение проблемы, и требуется всего около 5 строк кода. Вам также необходимо добавить Apache Deltaspike к вашим зависимостям, если он еще не установлен.

В вашем DAO, добавить импорт для BeanProvider:

import org.apache.deltaspike.core.api.provider.BeanProvider; 

Тогда мы просто сделать DAO синглтона:

public static UserDao getInstance() { 
    return BeanProvider.getContextualReference(UserDao.class, false, new DaoLiteral()); 
} 

Это довольно много его. В вашем сценарии пролетного пути теперь вы можете получить доступ к DAO:

@Override 
public void migrate(Connection cnctn) throws Exception{ 
    UserDao userdao = UserDao.getInstance(); 
    List<User> userList = userdao.getAllUsers(); 
    ... 
} 

Объяснение: Класс (VX_yourflywaymigrationscript) не управляется CDI контейнер, так что это не возможно, чтобы впрыснуть DAO. BeanProvider создан именно для этого: он может загружать Bean и давать вам ссылку, даже если вы не находитесь в контексте CDI.

Надеюсь, что это поможет.

Смежные вопросы