我正在使用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"
但看起来相同。
答案 0 :(得分:0)
这是XY problem;如果其他人和我在这里走的路一样,那就是我学到的......
真正的根本原因是创建了表(和约束)(使用Liquibase)以符合使用旧版本的hibernate(v3)构建的应用程序。
我们将应用程序升级到hibernate4,并且其hbm2ddl测试抱怨应用程序的注释与真实数据库中的某些constaints不同。
从hbm2ddl错误消息中,我认为导致问题的是unique
后缀,但是,只需需要更改约束名称删除constaint和除了使用所需的constraintName之外,重新添加它。
所以我取得了进步,但是在liquibase ....
<dropForeignKeyConstraint baseTableName="FooMetaData" constraintName="FK948B6448448663FC"/>
<addForeignKeyConstraint
// SNIP
constraintName="UK_jbjctqk7dys3q0xr5brfsdjvv"
// SNIP same attributes as original addForeignKeyConstraint
我不需要改变与unique(metaDataId)有关的任何事情