主キーの自動採番のサポート

これまでMirageでは主キーはアプリケーション側で生成するか、データベース側で自動採番するか(INSERT時のSQLには含めないのでトリガでもなんでも使って好きに採番して)の二択だったのですが、インサート後に採番された値が取得できないといろいろ不自由なので思い切ってMirage側でいくつかの採番方法をサポートすることにしました。

アプリケーション側で採番

@PrimaryKeyのgenerationTypeにGenerationType.APPLICATIONを指定します。SqlManager#insertEntity()に渡す前にアプリ側で主キーの値を設定しておきます。インサートのSQLに含められます。

@PrimaryKey(generationType=GenerationType.APPLICATION)
public Long id;

データベース側で自動採番

@PrimaryKeyのgenerationTypeにGenerationType.IDENTITYを指定します。インサートのSQLには含められません。データベースの自動採番機能を使用して採番することを想定しています。採番された値を取得するためにデータベースのJDBCドライバがPreparedStatement.RETURN_GENERATED_KEYSをサポートしている必要があります(Oracleでは利用できません)。

@PrimaryKey(generationType=GenerationType.IDENTITY)
public Long id;

シーケンスで自動採番

@PrimaryKeyのgenerationTypeにGenerationType.SEQUENCE、generatorにシーケンス名を指定します。SqlManager#insertEntity()内部でMirageがシーケンスを取得してエンティティに設定します。インサートのSQLに含められます。

@PrimaryKey(generationType=GenerationType.SEQUENCE, generator="USER_ID_SEQ")
public Long id;

採番テーブルを使用する方法もいずれサポートしようと思いますが、とりあえず次回のリリースではこんな感じで行こうと思います。
PreparedStatement.RETURN_GENERATED_KEYSのサポート状況やシーケンスの取得方法がデータベースによって異なるのでいろいろ面倒なのですが…。あと今はシーケンスを毎回取得しに行っているので大量インサート時のことを考えるとS2JDBCみたいにシーケンスのキャッシュをしたほうがいいかもとか、いろいろ課題がありますね…。