2012-04-10 13 views
1

私は春に持っているこのデザインの問題についていくつかの助けが必要です。私はSpringとHibernate、JPAなどの初心者だと言わなければなりません。SpringにABSTRACT永続性レイヤーを作成するには?

私たちは、Springをベースとし、異なるMavenモジュールに分離されたWebアプリケーションを作成しています。モジュールは、(小さな矢印 ' - >'、 "参照" を意味する):

  • [1]プロジェクト(アプリケーションのヘッド; POM)
  • [2]コアモデル(ここでJPA注釈)
  • [3]コアビジネスロジック( - >コアモデル)
  • [4] Webアプリケーション( - >永続性、 - >コアビジネスロジック)
  • [5]永続抽象( - >コアモデル)
  • [ 6]持続性impl関係のデータベース( - >持続性の要約)
  • [7]永続性のimpl xmlファイル( - >永続抽象)
  • [8]永続IMPL ...
  • [5]、我々はいくつかのクラスまたは抽象を定義する抽象永続化層を作成したいと

ビジネスオブジェクトを永続化するためのサービス(インタフェース?)

In [6]は、ビジネスオブジェクトを永続化するためにHibernate/JPAを使用する実装でなければなりません。私がMavenを理解する限り、他のMavenモジュールでJPAアノテーションを使用することは可能です。ここ[2]さらに、ビジネスオブジェクトをxmlファイルや他のソースに永続化する実装を[7]持っていたいと考えています。

実際の永続性実装をWebアプリケーションモジュールから隠す方法はありますか?このようなアーキテクチャを使用するには、[4]と[5]で何を指定しなければなりませんか?

私たちの意図は、Webアプリケーションモジュールに抽象パーシスタンスモジュールについてのみ認識させ、実際のパーシスタンスタイプまたはストレージソースを使用するかどうかを決定する設定ファイルを持つことです。

[6]のSpring Data JPAと[7]の何か他の方法を使用する方法はありますか?

ありがとうございます。

答えて

2

デザインパターンの世界を少し読んだりダイビングしたりして、私は次のことをして自分の経験を共有することにしました(参考までに私の最初の記事をご覧ください)。

私はストラテジーパターンを使用しましたが、あなたはgoogleにしたい場合はDAOFactory-Patternと呼ぶこともできます([5]、[6]、[7]など)。それに関連して、私はGenericDAO-Patternを使用しました。これは、「Java Persistence with Hibernate」という本で非常によく説明されています。

ストラテジーパターンは基本的に、私のケースではPersistenceStrategyと呼ばれる実際の永続性実装を抽象化したインターフェースで構成されています。さらに私はその永続性戦略を包括するサービスPersistenceServiceを持っています。

public interface PersistenceStrategy { 
    public void persist(BaseEntity object); 
    ... 
} 

PersistenceService:

public class PersistenceService { 

    private PersistenceStrategy persistenceStrategy; 

    public void setPersistenceStrategy(PersistenceStrategy strategy) { 
     this.persistenceStrategy = strategy; 
    } 

    public PersistenceStrategy getPersistenceStrategy() { 
     return this.persistenceStrategy; 
    } 
} 

実際の永続クラス[6]及び[7](例えばPersistenceStrategyHibernate)など、このインタフェースを実装し、Iは、Spring Beanとしてそれらを宣言しました。また、PersistenceServiceをBeanとして宣言しました。実際のPersistenceStrategyはPersistenceServiceに注入されます。このBean定義はwebappプロジェクト[4]ではなく、例えば[5]と[6]の実際の永続化実装にあります。

<bean id="hibernatePersistenceStrategy" class="org.myProject.persistence.relational.HibernatePersistenceStrategy" /> 

<!-- PersistenceService is instantiated here with the actual persistence strategy implementation --> 
<bean id="persistenceService" class="org.myProject.persistence.PersistenceService"> 
    <property name="persistenceStrategy" ref="hibernatePersistenceStrategy"></property> 
</bean> 

私のwebapp mavenプロジェクト[4]では、実際の永続化実装を参照しています。 [5]または[6]。

<dependency> 
    <groupId>org.myProject</groupId> 
    <!-- this is where the persistence module is referenced. 
     if you want to change the type of persistence you can do it here. --> 
     <artifactId>persistence-relational</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
</dependency> 

私のコントローラクラスでは、PersistenceServiceとPersistenceStrategyを参照できます。

@Controller 
public class NewDatasetController { 

    @Autowired 
    PersistenceStrategy persistenceStrategy; 

    @RequestMapping("/") 
    public String landing() { 

     ... 
    } 
} 

これらのパターンは、私の意見ではかなりいいです。この投稿に何かを追加したい場合は、気軽にご利用ください。

+0

PersistenceServiceの使用方法がよく分かりません –

+0

PersistenceServiceの利点は、persistenceStrategyオブジェクトを取得するための中央オブジェクトを持つことです。しかし、あなたは正しいです。私は 'hibernatePersistenceStrategy' Beanの名前を 'persistenceStrategy'に変更し、必要な場所で@Autowireを実行し、そのような方法で実際の実装にも抽象的に留まることができると思います。 – matthaeus

関連する問題