Polyformsプロジェクトの最終目標はデータ・アクセス・オブジェクトをその背後にある永続化層のAPIと密に結合させてしまっている多くの複製コードを削減することである。このフレームワークでは開発者が定義したRepository (リポジトリ)インタフェースのサービス・メソッドを自動的に実装するアプローチをとっている。インタフェースに定義されたメソッドは、既定では、命名規約によってデータベース操作と関連付けられている。例えば、Wiki(リンク)ではUserエンティティに対するリポジトリをどのように実装すればいいのか議論されている 。まず、リポジトリのAPIを定義しなければならない。
public interface UserRepository extends EntityRepository<User, String> {
@Finder
List<User> findByCreator(User creator);
}
@FinderアノテーションはPolyformsのためにマーキングである。UserRepositoryの実装をする代わりに、Userエンティティに対する別のアノテーションによってHibernateのクエリを用意しておく必要がある。
@NamedQueries({
@NamedQuery(name = "User.findByCreator", query = "select u from User u where u.creator = :creator"),
})
public class User {
...
}
ドキュメントにあるように、クエリを探すための命名規約はメソッド名と同様にエンティティ名そのものにもに基づいている。
メソッドと名前付きクエリをマッピングするルールは[名前付きクエリの名前] = [エンティティ名].[メソッド名]です。名前付きクエリの名前は@Finderを@Finder("findUserByName")のように使うことで指定できます。この場合、名前付きクエリの名前は"User.findByName"になります。
@Finderアノテーションに加えて、@Updaterと@Counterというアノテーションもそれぞれ一括更新やカウント・クエリをサポートするために用意されている。
EntityRepositoryという親インタフェースで既に単一のエンティティに対する保存、削除そしてID検索はサポートされている。
このような処理は全てSpringフレームワーク(リンク)によって行われ、これらのAPIに対する実行時の実装を提供するためにSpringのアスペクトに依存している。
Polyformsではこの他に以下のような機能がサポートされる。
- 追跡用の情報(作成者, 作成日, 更新者, 更新日)が自動管理される
- ページ遷移の透過的なサポート
- アノテーションによるトランザクション境界の定義
- 永続化イベントをアプリケーションの機能から分離するためのドメイン・イベント・モデル
より詳細な情報はPolyforms wiki(リンク)より入手可能できる。