アノテーション汚染
ここ何日か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ファイルに戻そうかなぁ...。