我有一个主键列,它是一个 INT 列,我想将其更改为 BIGINT。我们的测试和生产环境使用 MySQL,但对于单元测试,我们使用嵌入式 H2 数据库。
我创建了以下 Liquibase 重构:
...
<changeSet id="1" author="trond">
<modifyDataType tableName="event" columnName="id" newDataType="BIGINT" />
<rollback>
<modifyDataType tableName="event" columnName="id" newDataType="INT" />
</rollback>
</changeSet>
...
重构工作,但是当我尝试使用 Hibernate 将对象持久保存到数据库时,我收到以下错误消息(我已经包装了错误消息):
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]
MyEvent 类继承自 AbstractBaseEvent,它在代码中定义了以下 Hibernate 映射:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
几点:
- 休眠映射在重构数据类型之前起作用
- Liquibase 的版本是 2.0.1
- 这是否适用于 MySQL 尚未经过测试