1

春に発生したこの設計上の問題について、助けが必要です。私はSpringとHibernate、JPAなどの初心者だと言わざるを得ません。

Spring に基づいた、さまざまな Maven モジュールに分割された Web アプリケーションを作成しています。モジュールは次のとおりです (小さな矢印 '->' は「参照」を意味します):

  • [1] プロジェクト (アプリケーションの先頭; pom)
  • [2]コアモデル(jpaアノテーションはこちら)
  • [3] コア ビジネス ロジック (-> コア モデル)
  • [4] webapp (-> 永続性、-> コア ビジネス ロジック)
  • [5] 永続性抽象 (-> コア モデル)
  • [6] 持続性 impl リレーショナル データベース (-> 持続性抽象)
  • [7] 永続化 impl xml ファイル (-> 永続化抽象)
  • [8] 永続化実装 ...

[5] では、ビジネス オブジェクトを永続化するためのいくつかのクラスまたは抽象サービス (インターフェイス?) を定義する抽象永続化レイヤーを作成したいと考えています。

[6] は、ビジネス オブジェクトを永続化するために Hibernate/JPA を使用する実装である必要があります。私が Maven を理解している限り、別の Maven モジュールで JPA アノテーションを使用することは可能です [2]。さらに、[7] では、ビジネス オブジェクトを xml ファイルまたはその他のソースに保持する実装が必要です。

実際の永続化の実装を Web アプリ モジュールから隠す方法を知っていますか? このようなアーキテクチャを使用するには、[4] と [5] で何を指定する必要がありますか?

私たちの意図は、Web アプリ モジュールに抽象永続性モジュールのみを認識させ、実際の永続性タイプまたは使用するストレージ ソースを決定する構成ファイルをそこに持たせることです。

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

前もって感謝します。

4

1 に答える 1

2

わかりました、少し読​​んでデザインパターンの世界に飛び込んだ後、次のことを行い、私の経験を共有することにしました(参照を解決するには、私の最初の投稿を参照してください)。

永続層 ([5]、[6]、[7] など) には Strategy-Pattern を使用しましたが、ググればDAOFactory-Patternと呼ぶこともできます。それに関連して、「Java Persistence with Hibernate」という本で非常によく説明されているGenericDAO-Patternを使用しました。

Strategy-Pattern は基本的にインターフェイスで構成されています。私の場合は、実際の永続化の実装を抽象化するPersistenceStrategyと呼ばれます。さらに、その Persistency Strategy をラップするサービス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 など) などはこのインターフェイスを実装しており、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() {

        ...
    }
}

これらのパターンは、私の意見ではかなりいいです。この投稿に何か追加したい場合は、お気軽にどうぞ。

于 2012-04-19T12:29:00.297 に答える