Я знаю, это приходит очень поздно, но и для будущих посетителей с той же проблемой это может быть полезно.
Создатель 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.
Надеюсь, что это поможет.
Что вы подразумеваете под «flyway не работает с DAOs»? –
Заинтересованы, если миграция DML может быть выполнена с использованием уровня «Службы» и «Стойкость», с задействованным пролетом. –