1:0...1の関連[DDD]

リポジトリを設定するのは誰なのか

Hoge案件をHuga承認するというイベントがあった場合、1:0...1の関係を現すのに下(コード例:1)のような感じにしている。

コード例:1

public HogeEntiry {
    private HogeId hogeId; 
    private FugaEntity fugaEntity;

    public HogeEntity(){}

    public HogeEntity(HogeId hogeId, FugaEnrity fugaEntity){
        this.hogeId = hogeId;
        this.fugaEntity = fugaEntity;
    }

    // ... ゲッターは省略
}

そこで承認時のメソッドをモデル追加する

その中では承認を行った際にFugaEntityをpersistするためのFugaEntityRepositoryをどこで設定すべきなのか?

コード例:2

public HogeEntity {

    //FugaEntity用のリポジッリ
    private FugaEntityRepository fugaEntiryRepositoty;
 
    public HogeEntiry(HogeId hogeId, FugaEnrity fugaEntity, FugaEntityRepository fugaEntityRepositoty){
        this.hogeId = hogeId;
        this.fugaEntity = fugaEntity;
        this.fugaEntityRepositoty fugaEntityRepositoty; 
    }
    // ... 

    /**
     * 承認する
     * <pre>
     * 既に承認済みでも再承認を受け付けないが例外判定は省略
     * </pre>
     * @param approvedUser 承認者;
     * @param approvedDateTime 承認日時;
     */
 public void approbe(User approvedUser ,ApplobedDate approvedDateTime){
       FugaEntity fugaEntty = new fugaEntity(approvedUser,approvedDateTime);
       fugaEntityRepository.store(fugaEntity);
       this.fugaEntity = fugaEntity;
    }
}

結論

サービスで実装する。リポジトリの設定漏れが起きるのでエンティティにはリポジトリを持たない。コード例:3
トランザクションスクリプト的で気持ち悪いと思う場合、コード例:4の様にHogeEntitiesRepositoryのメソッドで頑張る様にする。

コード例:3

@Service
public HogeService {
    private HogeEntitiesRepository hogeEntitiesRepository;
    private FugaEntitiesRepository fugaEntitiesRepository;
    public void approve(HogeId hogeId,
        User approvedUser,
        ApplobedDate approvedDateTime){
        HogeEntity hogeEntity = hogeEntitiesRepository.findById(hogeId);
        hogeEntity.assets(HogeSpesification.APPROVE_SPEC);
        FugaEntity approve = new FugaEntity(
            hogeId,
            approvedUser,
            approvedDateTime);
        );
        fugaEntitiesRepository.store(approve);
    }

}

コード例:4

@Service
public HogeService {
    private HogeEntitiesRepository hogeEntitiesRepository;
    public void approve(HogeId hogeId,
        User approvedUser,
        ApplobedDate approvedDateTime){
        HogeEntity hogeEntity = hogeEntitiesRepository.findById(hogeId);
        hogeEntity.assets(HogeSpesification.APPROVE_SPEC);
        FugaEntity approve = new FugaEntity(
            hogeId,
            approvedUser,
            approvedDateTime);
        );
        hogeEntity.approve(approve);
        hogeEntitiesRepository.store(hogeEntity);
    }
}