Tengo una columna de clave principal que es una columna INT que me gustaría cambiar a BIGINT. Nuestro entorno de prueba y producción utiliza MySQL, pero para las pruebas unitarias utilizamos la base de datos H2 incorporada.Liquibase: Cambie una columna de autoincrement INT a BIGINT utilizando modifyDataType refactoring con base de datos H2
He creado la siguiente refactorización Liquibase:
...
<changeSet id="1" author="trond">
<modifyDataType tableName="event" columnName="id" newDataType="BIGINT" />
<rollback>
<modifyDataType tableName="event" columnName="id" newDataType="INT" />
</rollback>
</changeSet>
...
Las obras de refactorización, pero cuando trato de persistir un objeto a la base de datos usando Hibernate, me sale el siguiente mensaje de error (me he envuelto el error mensaje):
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]
la clase MyEvent hereda de una AbstractBaseEvent que ha definido el siguiente mapeo de Hibernate en el código:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
Unos pocos puntos:
- El mapeo de Hibernate funciona antes de la refactorización del tipo de datos
- Versión 2.0.1 de Liquibase es
- Independientemente de si esto funciona con MySQL todavía no se ha probado
Muy buen análisis, gracias. El único problema que veo con el uso de SEQUENCE es que MySQL no admite secuencias. Una opción puede ser usar una tabla de secuencia que hemos utilizado en otro caso. – tronda
Buena idea: utilizar la tabla es la más portátil de todos modos. –
Si la portabilidad es su preocupación, básicamente no hay duda: debe usar '@ TableGenerator'. –