アプリケーションでは、ドメイン オブジェクトの永続性と 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 つの追加の要求が必要になります。UserPO
userRepository.participateToMeeting
UserPO
MeetingPO
このパフォーマンスを低下させることなく、変換ドメイン オブジェクト/永続オブジェクトを処理するためのより良い方法はありますか?