Spring Data Jpa 当Mongock迁移文件中使用的类和集合的名称发生变化时该怎么办?

e5njpo68  于 2023-11-19  发布在  Spring
关注(0)|答案(1)|浏览(110)

我在Sping Boot 有一个app,用MongoDB搭配Mogock,最近做了一个大的重构,改了很多类名和集合名,重构前我原来有的是一个实体FooDb:

@Document("foo")
public class FooDb {
  @Id
  private String id;
  ...
}

字符串
一些接口:

@Repository
public interface FooRepository extends MongoRepository<FooDb, String> { ... }


迁移文件:

@ChangeUnit(order="001, ...)
public class CreateFooChangelog {
  ...
  @Execution
  public void migration(FooRepository repository) {
     repository.save(...);
  }
}


在重构过程中,我只改变了集合和类的名称。它们的结构是一样的:

@Document("bar")
public class BarDb {
  @Id
  private String id;
  ...
}

@Repository
public interface BarRepository extends MongoRepository<BarDb, String> { ... }


然而,现在我不确定如何处理现有的迁移文件。修改现有的迁移文件是个好主意吗?我肯定需要修改它,因为代码中不再存在Foo* 类。
我可以想到这样的解决方案:如果存在一个foo集合,则需要将其重命名为bar,如果没有,则需要使用一些默认数据初始化bar。然后我可以尝试像这样修改此迁移文件:

@ChangeUnit(order="001", ...)
public class CreateBarChangelog {
  ...
  @Execution
  public void migration(BarRepository repository) {
     // if foo exists, rename it to bar
     // else: repository.save(...);
  }
}


在这种情况下,这是正确的方法还是有更好的解决方案?

ckocjqey

ckocjqey1#

有几个方面要讨论。

***修改现有的迁移文件是否是个好主意?**Mongock,与任何其他同类迁移工具一样,它旨在通过应用我们称之为changeUnits的序列将数据库从状态S(0)迁移到状态S(n)。(迁移变化),这将使数据库经历所有状态S(0),S(1),..,S(n-1),S(n).这在新环境中从头开始部署应用程序时特别有用。考虑到这一点,这个重命名过程应该是另一个状态S(n+1)更多。所以答案是NO,我们建议不要修改现有的changeUnits(出于这个原因)
*我肯定需要修改它,因为代码中不再存在Foo__ classes这就是为什么我们建议不要直接使用changeUnits中的repository和domain classes以及MongoTemplate(或driver classes)的原因。此时,您有三种选择:

    • 更改项目中的迁移文件 *:不推荐,因为这些文件(changeUnits)应尽可能保持不变。
    • 在项目中保留已弃用的类 *:不推荐,因为这会强制您在项目中保留已弃用的代码
      *将这些弃用的类移动到一个单独的库中,并通过maven/gradle将其引入到您的项目中。这也不是100%理想的方法,但我们推荐的方法是因为,在三个选项中,它提供了最佳的平衡(changeUnits保持不变,您的项目可以在不维护弃用的类的情况下进行发展)

最后,我们建议。
1.不更改现有的更改单位
1.作为迁移步骤的一部分,在changeUnit中执行重命名
1.将弃用的类移动到一个独立的库中,并将其作为maven/gradle依赖项

相关问题