4

私はDDDを初めて使用し、ここで立ち往生しています。ユーザーとグループの2つのエンティティ間に多対多の関係があります。ユーザーはグループなしで存在でき、グループはユーザーなしで存在できるため、関係は集約ではありません。

これは、Userクラスの私のコードです。

public class User {

    private List<Group> groups = new ArrayList<Group>();

    private UserRepository userRepository;

    public void create() throws Exception{
        userRepository.create(this);        

        // I have to update the groups with the user.
        for (Group group : groups) {
            group.update();
        }
    }

     public void addGroup(Group group){
        if (!groups.contains(group)) {
            groups.add(group);
            group.addUser(this);
         }
    }
}

問題は、グループを含むユーザーを作成するときに、これらのクラスをどこに関連付けるかがわからないことです(ORMは使用できません)。Userのcreateメソッドで作成し、Springを通じてトランザクションを管理しています。これは正しいです?または、そのコードをuserRepositoryまたはServiceに配置する必要がありますか?

ありがとう!

4

3 に答える 3

3

Eric Evansの本によると、多対多の関連付けにより、モデルが複雑になりすぎます。それらを2つの多対1の関連付けに置き換えてみてください。多対多の協会の一部は、常に他の部分よりもビジネス価値があります。

あなたの場合、私は2つのアグリゲートを使用します-UserGroup、ここで、Userアグリゲートはの束を保持する責任がありGroupReferencesます。

于 2011-08-11T05:15:28.360 に答える
1

ルーカス、私は:

1)新しいユーザーに関連付ける必要のあるグループを取り込むことができるユーザーファクトリを作成します。ファクトリは、addGroupメソッドを使用してその関連付けを行うことができます。

2)UserクラスからUserRepositoryへの参照を削除します。

于 2011-08-10T16:40:39.020 に答える
1

Userのcreateメソッドで作成し、Springを通じてトランザクションを管理しています。これは正しいです?

このロジックの正確さは、リポジトリの記述方法とそのコントラクトによって異なります。リポジトリが関係を維持しない場合は、リポジトリの設計が不十分である可能性があります。リポジトリには、エンティティの単純なプロパティだけでなく、エンティティの関連付けも格納するために必要なロジックが実装されていると思います。

ORMソリューションに基づくリポジトリは、永続性イベントをカスケードすることでこれを容易にしますが、あなたの場合、両方のリポジトリでコードが重複する可能性があります(私はあなたにもあると想定していますGroupRepository)。どのエンティティが関係を所有するかを決定してから、対応するリポジトリによって関連付けを永続化する方がよい場合があります。したがって、アソシエーションの変更は、アソシエーションを所有するエンティティによってのみ行われる必要があります(Userあなたの場合はそうであるように見え、推論によりUserRepository、アソシエーションを管理する必要があります)。

于 2011-08-10T16:47:12.120 に答える