A Day In The Life

とあるプログラマの備忘録

アノテーション汚染

ここ何日かHibernateAnnotationsを使ってみて気づいたことなんですが、ビジネス層がアノテーションで汚染されてるような気が...。



現在作成中のアプリケーションのレイヤ構成とパッケージ構成はこんな↓感じです。

プレゼンテーション
|-action
?form
ビジネス
|-service
|-model
|-Order(以下クラス)
|-OrderItem
|-Item
|-Customer
:
?dao(インターフェイス)
データアクセス
?dao(実装)
この構成一部で凸型レイヤとか言われているパターンです。

このパッケージ構成のメリットはビジネス層がDao層に依存しないのでビジネス層の独立性が高く再利用しやすいことです。

HibernateやめてiBatisにするぞとなったときにDao層だけ入れ替えればOKだったりします。



でもこの構成でHibernateAnnotationsを使ってしまうとmodelパッケージのクラスがHibernate(またはJPA)に依存してしまうことになります。

具体的には

package jp.dip.commonsense.business.model;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;

import org.hibernate.annotations.AccessType;

@Entity
@Table(name="customers")
@AccessType("field")
public class Customer {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String name;
    @Embedded
    private Profile profile;
    @Version
    private Integer version;
    :
    getter/setter略
}

javax.persistenceやorg.hibernate.annotationsのクラスに依存してますね。ビジネス層がDao層に依存するわけではないですけど特定のフレームワークに依存してしまうのでよくないですね。

これだと凸型レイヤにした意味がなくなるので対策として

  • hbmファイルに戻す
  • Hibernate専用のビーンクラスを作成してModelクラスと変換する
などが考えられます。

どっちも微妙ですね、アノテーション使うにもメリットデメリットがあるということか。

hbmファイルに戻そうかなぁ...。

参考