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; } }