【发布时间】:2016-09-20 05:21:24
【问题描述】:
我正在使用 hibernate4 hbm2ddl 来检查 mysql 模式是否是最新的。它告诉我桌子需要改变:
alter table ems.FooMetaData
drop constraint UK_jbjctqk7dys3q0xr5brfsdjvv
alter table ems.FooMetaData
add constraint UK_jbjctqk7dys3q0xr5brfsdjvv unique (metaDataId)
该表在 MySQL 中是这样的:
mysql> show create table FooMetaData;
| FooMetaData | CREATE TABLE `FooMetaData` (
`fooMemberId` int(11) DEFAULT NULL,
`metaDataId` varchar(255) DEFAULT NULL,
KEY `FK948B6448448663FC` (`metaDataId`),
KEY `FK948B64486FA1E99D` (`fooMemberId`),
CONSTRAINT `FK948B6448448663FC` FOREIGN KEY (`metaDataId`) REFERENCES `BarValues` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK948B64486FA1E99D` FOREIGN KEY (`fooMemberId`) REFERENCES `Foos` (`fooMemberId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
它是使用 Liquibase(3.4.2 版)这样创建的
<changeSet author="myauthor" id="myid">
<addForeignKeyConstraint baseColumnNames="metaDataId"
baseTableName="FooMetaData" baseTableSchemaName="foo" constraintName="FK948B6448448663FC"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION"
referencedColumnNames="id" referencedTableName="BarValues"
referencedTableSchemaName="foo" referencesUniqueColumn="false"/>
</changeSet>
如何使用唯一的 (metaDataId) 更新约束?
我尝试在 liquibase 的 hbm2ddl 中删除该约束并添加 referencesUniqueColumn="true" 但看起来相同。
【问题讨论】:
-
我不确定我是否理解您的要求 - 但需要考虑两件事:让 liquibase 使用
updateSQL而不是update运行。它将生成 SQL 语句,而不是直接在数据库上运行它们。通过这种方式,您可以检查 liquibase 真正生成的内容。第二件事是:我也在使用 liquibase 和 hibernate,并且约束名称看起来很像 hibernate 生成的。那么你确定你的表真的是由 liquibase 生成的吗?
标签: hibernate jpa liquibase hbm2ddl