使用Java进行Flyway迁移

3

我学习了使用Java和JDBC连接以及SpringTemplate支持的Flywaydb迁移,但是Flyway不支持DAO。

对于具有更多关系的表/实体,使用DAO进行迁移比使用SQL更容易。

是否有解决方案或解决方法来处理这个问题?


“flyway doesn't work with DAOs” 是什么意思? - G Quintana
有兴趣知道是否可以使用服务和持久层以及Flyway来进行DML迁移。 - Abreham Tesfu
3个回答

2

首先,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();
  }
}

1
我知道这很晚,但对于未来遇到同样问题的访问者来说,这可能会有所帮助。在我看来,Flyway的创建者在这个主题上实际上是错误的。只要您在更新脚本中不更改数据库结构,使用业务逻辑迁移数据就完全没有问题,不存在鸡和蛋的问题。
举个例子:您的数据库中有一个名为“password”的字段,它是明文。由于安全问题,您现在想使用特殊的哈希函数并哈希数据库中的所有密码(它应该是安全的,并且数据库没有执行此操作的功能)。哈希函数在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());
}

那就这样了。在您的Flyway脚本中,现在可以访问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上下文中也可以。
我希望这有所帮助。

0

你的DAO依赖于Flyway旨在更改的结构。因此,我们在这里遇到了先有鸡还是先有蛋的问题。解决这个问题的方法是在应用程序的其余部分(包括DAO)初始化之前运行Flyway。


我正在寻找一种使用业务逻辑代码进行迁移的方法,是否有关于如何执行自定义迁移解析器或执行器的参考示例?我希望执行器实现ApplicationContextAware以便在flyway迁移代码中查找我的DAO和资源。 - Abreham Tesfu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接