我在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(...);
}
}
型
在这种情况下,这是正确的方法还是有更好的解决方案?
1条答案
按热度按时间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)的原因。此时,您有三种选择:
*将这些弃用的类移动到一个单独的库中,并通过maven/gradle将其引入到您的项目中。这也不是100%理想的方法,但我们推荐的方法是因为,在三个选项中,它提供了最佳的平衡(changeUnits保持不变,您的项目可以在不维护弃用的类的情况下进行发展)
最后,我们建议。
1.不更改现有的更改单位
1.作为迁移步骤的一部分,在changeUnit中执行重命名
1.将弃用的类移动到一个独立的库中,并将其作为maven/gradle依赖项