使用liquibase和hibernate删除/插入约束

xpszyzbs  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(524)

我刚开始液化+冬眠。
我有一个名为users的表,有{id,firstname,lastname,yearofbirth,…}列。我用hibernate注解为偶{id,lastname}设置了一个唯一的约束。
现在,我决定更新约束,包括firstname列,这意味着我希望我的唯一约束是{id,firstname,lastname}。这可以通过liquibase,在我现有的数据库上,通过一个变更集来完成吗?
我考虑过通过变更集删除旧的约束,然后用另一个约束创建新的约束。问题是,我不知道旧约束的名称,也不知道它后面的索引的名称。由于liquibase/hibernate会自动为约束/索引生成名称,所以我不想通过查询来获取特定的约束名称。
我正在寻找一个更通用的解决方案,这样我就可以解决同样的未来问题。
有什么建议吗?
我使用的是Java8,Hibernate5.2.10,Liquibase3.5.2

xmd2e60i

xmd2e60i1#

未来注意事项:
可以通过以下方式设置唯一的约束名称:

@Table(uniqueConstraints = 
    @UniqueConstraint(columnNames = { "unique_field" }, name = "UK_users_unique_field")

我认为,如果您想使用liquibase,就不应该通过hibernate创建模式。您需要使用sql脚本来创建一个模式。当然,您可以通过hibernate生成sql脚本。
使用

hibernate.hbm2ddl.auto=validate

只验证数据库模式,而不创建任何内容。

sycxhyv7

sycxhyv72#

不幸的是,删除索引名称时,它是一个必填字段。以下是liquibase的相关文档。
在这种情况下,需要使用sql命令删除索引。根据基础数据库是什么,您将需要根据索引的列名以编程方式计算分配给要删除的表的索引的名称。例如,如果您使用的是oracle数据库,则可以运行此处介绍的sql并将这些命令捕获到sql文件中。liquibase支持将sql文件包含为变更集,因此您需要在您的变更集中使用sqlfile标记,如这里所述,以便运行前面捕获的sql语句。一旦删除了索引,就可以根据需要再次使用liquibase变更集添加新的索引/约束。

相关问题