今週はがっつりとS2JDBCを使っているので、興味が出てきてS2JDBCの中身を見てみました。あまり時間がないので、とりあえずAutoSelectImplとSqlFileSelectImplだけ。並べてみると面白いですね。SqlFileSelectImplはかなりシンプルになっていて、ほぼパラメータをパースすることに徹していました。これに対して、AutoSelectImplはS2JDBCの売りの流れるようなインターフェースを受け止めるところだけあって、丁寧に作ってあります。
そもそもソースを見てみようと思ったきっかけは、OneToOneやOneToMany等のテーブルのリレーションをどうやっているのかなと思ったことです。ややこしそうなのに、シンプルにまとめてありました。結合準備のクラスから、それぞれのタイプごとにエンティティを用意しているだけのようです。ここまで完結に書けるのは凄いですね。勉強になるので時間を作ってじっくりソースを読んでいきたいです。
if (joinMeta.isFetch()) { List<PropertyMapper> propertyMapperList = new ArrayList<PropertyMapper>( 50); List<Integer> idIndexList = new ArrayList<Integer>(); if (!count) { prepareEntity(inverseEntityMeta, joinMeta, tableAlias, propertyMapperList, idIndexList); } PropertyMapper[] propertyMappers = toPropertyMapperArray(propertyMapperList); int[] idIndices = toIdIndexArray(idIndexList); AbstractRelationshipEntityMapper remapper = createRelationshipEntityMapper( relationshipClass, propertyMappers, idIndices, propertyMeta, inversePropertyMeta); entityMapperMap.put(joinMeta.getName(), remapper); baseEntityMapper.addRelationshipEntityMapper(remapper); } /** * 関連エンティティマッパーを作成します。 * * @param relationshipClass * 関連クラス * @param propertyMappers * プロパティマッパーの配列 * @param idIndices * 識別子のインデックスの配列 * @param propertyMeta * 関連のプロパティメタデータ * @param inversePropertyMeta * 逆側の関連のプロパティメタデータ * @return 関連エンティティマッパー */ protected AbstractRelationshipEntityMapper createRelationshipEntityMapper( Class<?> relationshipClass, PropertyMapper[] propertyMappers, int[] idIndices, PropertyMeta propertyMeta, PropertyMeta inversePropertyMeta) { Field inverseField = inversePropertyMeta != null ? inversePropertyMeta .getField() : null; switch (propertyMeta.getRelationshipType()) { case ONE_TO_ONE: return new OneToOneEntityMapperImpl(relationshipClass, propertyMappers, idIndices, propertyMeta.getField(), inverseField); case ONE_TO_MANY: return new OneToManyEntityMapperImpl(relationshipClass, propertyMappers, idIndices, propertyMeta.getField(), inverseField); case MANY_TO_ONE: return new ManyToOneEntityMapperImpl(relationshipClass, propertyMappers, idIndices, propertyMeta.getField(), inverseField); } throw new IllegalStateException(propertyMeta.getRelationshipType() .toString()); }
ちなみに読んだきっかけは、SqlFileSelectで結合のエンティティを自動的にセットしてくれないかなぁと期待したのが発端だったりします。この辺りね。
S2JDBCでSQLファイルを使う その2