【问题标题】:Flyway Migration with java使用 java 进行 Flyway 迁移
【发布时间】:2023-03-13 16:30:01
【问题描述】:

我了解到使用 java 进行 flywaydb 迁移可以使用 JDBC 连接,还可以通过 SpringTemplate 支持 spring,但是 flyway 不适用于 DAO。

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

是否有解决方案或变通办法来解决这个问题?

【问题讨论】:

  • “flyway 不适用于 DAO”是什么意思?
  • 感兴趣是否可以使用服务和持久层完成 DML 迁移,并涉及 flyway。

标签: java postgresql flyway


【解决方案1】:

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

【讨论】:

  • 我正在寻找一种使用业务逻辑代码进行迁移的方法,是否有任何关于如何自定义迁移解析器或执行器的参考示例,我希望执行器实现 ApplicationContextAware 以找到我的 DAO 和资源flyway迁移代码。
【解决方案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();
  }
}

【讨论】:

    【解决方案3】:

    我知道这来得太晚了,但对于未来遇到同样问题的访问者来说,这可能会有所帮助。

    在我看来,Flyway 的创建者在这个问题上实际上是错误的。用业务逻辑迁移数据完全没问题,不存在先有鸡还是先有蛋的问题,只要在更新脚本中不改变数据库的结构即可。

    一个例子:您的数据库中有一个“密码”字段,它是明文。由于安全问题,您现在想要使用特殊的哈希函数并对数据库中的所有密码进行哈希处理(它应该是安全的,而数据库没有这样做的功能)。哈希函数在您的 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 上下文中。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 2015-08-18
      • 2016-09-24
      • 2018-11-26
      • 1970-01-01
      • 2017-07-07
      • 2017-12-23
      • 2015-01-02
      • 2019-12-27
      相关资源
      最近更新 更多