Primary Keyについて
Butterfly Persistenceで扱うことのできるプライマリキーは一つのフィールドでなくてはならない。複数のフィールドを複合した場合には対応していない。
どのフィールドがプライマリキーであるかは自動的にデータベースメタデータから判定される。したがって、特にマッピング上でプライマリキーを指定する必要はない。
プライマリキーの判定ロジックを変更するには、IDbPrimaryKeyDeterminerインターフェースを実装したオブジェクトを次のようにPersistenceManagerに指定する。
persistenceManager .getConfiguration() .getObjectMapper() .setDbPrimaryKeyDeterminer(new MyKeyDeterminer());
次はHSQLDB用のプライマリキー判定クラスである。もともとのリリース(5.2.0)にも含まれているが、うまく動作していない。
private static class MyKeyDeterminer implements IDbPrimaryKeyDeterminer{
ObjectMappingFactory factory = new ObjectMappingFactory();
public IKey getPrimaryKeyMapping(String table, String databaseName, Connection connection)
throws PersistenceException{
ResultSet result = null;
IKey mapping = this.factory.createKey();
mapping.setTable(table);
try {
result = connection.getMetaData().getPrimaryKeys(null, databaseName, table.toUpperCase());
while(result.next()){
mapping.addColumn(result.getString(4));
}
} catch (SQLException e) {
throw new PersistenceException("Error determining primary key for table " + table, e);
} finally {
JdbcUtil.close(result);
}
return mapping;
}
}