2016-05-23 16 views
0

Ich verwende hibernate4 hbm2ddl, um zu überprüfen, ob ein MySQL-Schema aktuell ist. Es sagt mir, Tabelle Bedarf geändert:liquibase - Wie ändert man die Tabelle, um eine bestehende Einschränkung eindeutig zu machen?

alter table ems.FooMetaData 
    drop constraint UK_jbjctqk7dys3q0xr5brfsdjvv 
alter table ems.FooMetaData 
    add constraint UK_jbjctqk7dys3q0xr5brfsdjvv unique (metaDataId) 

Die Tabelle sieht wie folgt in MySQL war:

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 | 

Es ist wie diese erstellt wurde Liquibase (Version 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> 

Wie aktualisiere ich Constraint mit einem eindeutigen (metaDataId)?

Ich versuchte, diese Einschränkung in Hbm2ddl in Liquibase löschen und mit referencesUniqueColumn="true" hinzufügen, aber sieht gleich aus.

+0

Ich bin nicht sicher, zu tun, wenn ich verstehe, was du fragst - aber 2 Dinge, die du beachten solltest: Lass liquibase mit 'updateSQL' anstelle von' update' laufen. Es erzeugt die SQL-Anweisungen, anstatt sie direkt in der Datenbank auszuführen. Auf diese Weise können Sie überprüfen, was Liquibase wirklich erzeugt. Die zweite Sache ist: Ich benutze auch Liquibase und Hibernate und die Constraint-Namen sehen aus wie Hibernate generiert. Sind Sie sicher, dass Ihr Tisch wirklich von liquibase generiert wurde? – Jens

Antwort

0

Es war ein XY problem; für den Fall, dass jemand anders den gleichen Weg wie ich hier ist, ist was ich gelernt habe ...

Die eigentliche Ursache war die Tabellen (und Einschränkungen) wurden erstellt (mit Liquibase), um eine App mit älteren Version zu erfüllen von Winterschlaf (v3).

Wir haben App auf hibernate4 hochgestuft, und der Test hbm2ddl beschwerte sich über einige der Unterschiede in den Annotationen der App gegenüber der realen Datenbank.

Vom hbm2ddl Fehlermeldung, würde ich dachte, dass es das unique Suffix war, die das Problem verursacht wurde, aber es war einfach, dass benötigt der Constraint-Name geändert die constaint entfernen und erneut hinzufügen genau wie war außer mit dem gewünschten constraintName.

Also machte ich Fortschritte, aber in liquibase ....

<dropForeignKeyConstraint baseTableName="FooMetaData" constraintName="FK948B6448448663FC"/> 

<addForeignKeyConstraint 
    // SNIP   
    constraintName="UK_jbjctqk7dys3q0xr5brfsdjvv" 
// SNIP same attributes as original addForeignKeyConstraint 

und ich brauche nichts zu ändern, mit einzigartigen (metaDataId)