3

アプリケーションでは、ドメイン オブジェクトの永続性と ORM を処理する方法が少なくとも 2 つあります。

  • ある種の ORM (xml または注釈) を使用して、ドメイン オブジェクトを持続性に直接マッピングする
  • ドメインと永続モデル (表の列) の間でインピーダンスの不一致が多い場合に、問題を分離します。つまり、ドメイン オブジェクトは永続性に依存せず、対応する永続オブジェクトへの変換がいくつかあります。後者は ORM にマップされます。

純粋な DDD 開発者が知っているように、ドメインはデータベースのニーズによって駆動されるべきではありません。したがって、私のプロジェクトでは、この関心の分離を使用しています。誰かが YAGNI のことを考え、誰かが「素晴らしい」と言うでしょう (ここのように)。私のプロジェクトでは、再利用性の必要性に応じていくつかの異なるデータベースが必要になるため、ドメイン モデルと永続モデルの間で懸念事項を分離することを選択しました。しかし、Spring-Data で問題 (ある種のパフォーマンスの低下) に遭遇しました。merge詳細はおそらくですが、切り離されたエンティティを現在のトランザクションに再アタッチするための、または関連する機能を持たないORMを想定してください。

理解するために、この概念コード (Java) を考えてみましょう:

@Transaction
public void participateToMeeting(String userId, String meetingId){
  User user = userRepository.ofId(userId);  //returns a User domain type
  Meeting meeting = meetingRepository.ofId(meetingId); //returns a Meeting domain type
  if(user != null && meeting != null) {
    user.participate(meeting);    // as attached entity, this would automatically persist the relationship
  }
}

しかし、今後、永続化がドメイン モデルではなく永続化モデルで行われる場合、ドメインから永続化オブジェクトへの変換中に (実際、リポジトリは永続化オブジェクトを (ドメイン モデルに直接ではなく) 処理するようになるため)、アタッチメントが失われます。結果を戻り値の型としてドメイン オブジェクトとして変換するだけです)、managedEntity状態は失われます。

    @Transaction
        public void participateToMeeting(String userId, String meetingId){
          User user = userRepository.ofId(userId);  //returns a User domain type (converted from UserPO to User)
          Meeting meeting = meetingRepository.ofId(meetingId); //returns a Meeting domain type (converted from MeetingPO to UserPO)
          if(user != null && meeting != null) {
            userRepository.participateToMeeting(user, meeting); 
//although not conventional, adding this kind of method allows to convert User and Meeting to some persistent object: UserPO and MeetingPO, before proceeding to persistence
          }
        }

問題は次のとおりです。(インフラストラクチャUserレイヤーで) からに変換しているときに、エンティティの「添付ファイル」が失われます。したがって、このメソッドでは、(それらを接続するために) データベースから取得 して再度取得する必要があります...したがって、2 つの追加の要求が必要になります。UserPOuserRepository.participateToMeetingUserPOMeetingPO

このパフォーマンスを低下させることなく、変換ドメイン オブジェクト/永続オブジェクトを処理するためのより良い方法はありますか?

4

1 に答える 1

3

リンクされた記事に同意しません。ドメイン モデルと持続性モデルの間の懸念事項が異なることには同意しますが、ORM の全体的な目的は、ドメイン モデルと持続性モデルをマッピングすることです。ORM はそのマッピングを提供することになっているため、マッピングを容易にするために追加のクラス階層を作成するのはやり過ぎであり、説明しているような問題につながる可能性があります。ドメイン モデルがデータ モデルに似ているという事実は、単なる偶然ではありません。代わりに、それらは両方とも同じドメインの側面を表しているため、高度な対応が必要です。ORM は、オブジェクト モデルと対応するリレーショナル モデルの間の不一致に対処するように設計されています。マッピングが大変な場合もありますが、例えばNHibernateでは、

于 2013-07-15T17:05:10.810 に答える