私はBIGINTに変更したいINT列の主キー列を持っています。私たちのテスト環境と運用環境はMySQLを使用していますが、単体テストでは埋め込みH2データベースを使用しています。Liquibase:H2データベースのmodifyDataTypeリファクタリングを使用してINTオートインクリメント列をBIGINTに変更します。
私は、次のLiquiBaseをリファクタリング作成しました:
...
<changeSet id="1" author="trond">
<modifyDataType tableName="event" columnName="id" newDataType="BIGINT" />
<rollback>
<modifyDataType tableName="event" columnName="id" newDataType="INT" />
</rollback>
</changeSet>
...
リファクタリング作品を、私は休止状態を使用してデータベースにオブジェクトを永続化しようとすると、私は次のエラーメッセージ(私はエラーを包みましたを取得しますメッセージ):
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
:
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クラスコードに次のHibernateのマッピングを定義しているAbstractBaseEventから継承します
いくつかのポイント:
- LiquiBaseをのデータ型
- バージョンのリファクタリングが、これは、MySQLとの作品かどうかは、まだテストされていない2.0.1
- である前に、Hibernateマッピングの作品
非常に良い分析です - ありがとうございます。私がSEQUENCEを使って見る唯一の問題は、MySQLがシーケンスをサポートしていないことです。 1つのオプションは、別のケースで使用しているシーケンステーブルを使用することです。 – tronda
良いアイデア - とにかくテーブルを使用するのが最もポータブルです。 –
移植性が懸念される場合は、基本的に疑問はありません: '@ TableGenerator'を使用する必要があります。 –