Mam kolumnę klucza podstawowego, która jest kolumną INT, którą chciałbym zmienić na BIGINT. Nasze środowisko testowe i produkcyjne wykorzystuje MySQL, ale do testów jednostkowych używamy wbudowanej bazy danych H2.Liquibase: Zmień kolumnę autoinkrecji INT na BIGINT przy użyciu refaktoryzacji modifyDataType z bazą danych H2
Stworzyłem następujące Liquibase refaktoryzacji:
...
<changeSet id="1" author="trond">
<modifyDataType tableName="event" columnName="id" newDataType="BIGINT" />
<rollback>
<modifyDataType tableName="event" columnName="id" newDataType="INT" />
</rollback>
</changeSet>
...
pracach Refaktoryzacja, ale gdy próbuję utrzymywać obiekt do bazy danych przy użyciu Hibernacja, pojawia się następujący komunikat o błędzie (mam owinięty błąd komunikat)
ERROR org.hibernate.util.JDBCExceptionReporter [main]: NULL not allowed for column "ID";
SQL statement: insert into event (id, eventtime, guid, meta, objectguid, originatorid, subtype, type) values (null, ?, ?, ?, ?, ?, ?, '0') [90006-140]
JDBC exception on Hibernate data access:
SQLException for SQL [insert into event (id, eventtime, guid, meta, objectguid, originatorid, subtype, type) values (null, ?, ?, ?, ?, ?, ?, '0')];
SQL state [90006]; error code [90006]; could not insert: [event.MyEvent];
nested exception is org.hibernate.exception.GenericJDBCException: could not insert: [event.MyEvent]
Klasa MyEvent dziedziczy z AbstractBaseEvent którym określono następujące odwzorowanie hibernacji kodu:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
Kilka punktów:
- Mapowanie hibernacji działa przed refaktoringu typu danych
- Wersja Liquibase jest 2.0.1
- , czy to działa z MySQL nie został jeszcze przetestowany
Bardzo dobra analiza - dziękuję. Jedynym problemem jaki widzę przy użyciu SEQUENCE jest to, że MySQL nie obsługuje sekwencji. Jedną z opcji może być użycie tabeli sekwencji, z której korzystaliśmy w innym przypadku. – tronda
Dobry pomysł - używanie stołu jest i tak najbardziej przenośne. –
Jeśli chodzi o przenośność, to zasadniczo nie ma wątpliwości: musisz użyć '@ TableGenerator'. –