我是Liquibase + Hibernate的新手。
我有一个名为Users的表,列{Id,FirstName,LastName,YearOfBirth,.....}。 我使用Hibernate注释设置了一对{Id,LastName}的唯一约束。
现在,我决定要更新约束,包含FirstName列,这意味着我希望我的唯一约束为{Id,FirstName,LastName}。 这可以通过Liquibase在我现有的数据库中通过变更集来完成吗?
我考虑过通过变更集删除旧约束,并用另一个创建新约束。问题是,我不知道旧约束的名称,也不知道跟随它的索引的名称。由于Liquibase / Hibernate会自动为约束/索引生成名称,因此我不想搜索查询以获取特定的约束名称。
我正在寻找更通用的解决方案,因此我可以解决相同的未来问题。
有什么建议吗?
我使用的是Java 8,Hibernate 5.2.10,Liquibase 3.5.2
答案 0 :(得分:0)
不幸的是,索引名称在删除时是必填字段。以下是liquibase的相关文档。
在这种情况下,您需要使用SQL命令删除索引。根据底层数据库的内容,您需要以编程方式根据索引的列名指出要分配给您要删除的表的索引的名称。例如,如果您使用的是Oracle数据库,则可以运行SQL解释here并在sql文件中捕获这些命令。 Liquibase支持将SQL文件包含为更改集,因此您需要在更改集中使用sqlFile标记,如解释here所示,以便运行先前捕获的sql语句。删除索引后,您可以再次使用liquibase changeSet根据需要添加新的索引/约束。
答案 1 :(得分:0)
未来的一些注意事项:
您可以通过以下方式设置唯一约束名称:
@Table(uniqueConstraints =
@UniqueConstraint(columnNames = { "unique_field" }, name = "UK_users_unique_field")
我认为,如果你想使用Liquibase,你不应该通过Hibernate创建架构。您需要使用您的SQL脚本通过Liquibase创建架构。你当然可以通过Hibernate生成一个SQL脚本。
使用
hibernate.hbm2ddl.auto=validate
仅验证数据库模式,而不创建任何内容。