1. ホーム
  2. hibernate

[解決済み】DTOからエンティティへ、エンティティからDTOへ

2022-02-08 13:11:06

質問事項

プレゼンテーション層との間でDTOを使用してデータを送受信することになりました。 私たちは次のようなレイヤーを持っています。

  • ファサード
  • アプリサービス
  • ドメイン

そして、我々はエンティティをDTOに変換するのに役立つDozerを使用しています。 しかし、私は今2つの質問があります。

  1. エンティティからDTOへはドーザーを使用できますが、DTOからエンティティへはドーザーを使用できるのでしょうか?もし可能なら、どのように?
  2. エンティティはどこで作成するのですか?

例えば、私は本を登録しなければなりません。本のエンティティは次のようになります。

Book{
   public Book(BookNumber number,String name){
      //make sure every book has a business number,
      //and the number can't change once the book is created.
      this.bookNumber = number;
      ..
   }
}

で、DTOAssemblerを持っています。

BookDTOAssembler{

  BookDTO toDAO(bookEntity){
  ...
  }
  BookEntiy fromDTO(book DTO,BookRepository bookRepository){
    //1.Where should i create book entity? 
    //2.Is there any effective way to convert dto to entity in java world?
  }
}

オプション1

the BookManagedFacade has a registerBook function:
public registerBook(bookDTO){
   Book book = BookDTOAssembler.fromDTO(book DTO);
}

//Create book in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,BookRepository bookRepository){
    //book is never registered 
    if (0==bookDTO.getBookID()){
       Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName());
    }else{
       //book is been registed so we get it from Repository
       book = bookRepository.findById(bookDTO.getBookID()); 
    }
    book.setAuthor(bookDTO.getAuthor);
    ...
    return book;
}

オプション2

the BookManagedFacade has a registerBook function:
public registerBook(bookDTO){
   Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName());
   book = BookDTOAssembler.fromDTO(book DTO,book);
}

//add another function in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,Book book){
    book.setAuthor(bookDTO.getAuthor);
    ...
    return book;
}

どっちがいいんだろう?それとももっと良い方法で実装できるのか...?

解決方法は?

通常、オブジェクト(ドメインエンティティのDTO表現)をサーバーに転送し直すことはありません。なぜなら、そうすると、誰でもDTOに変更を加えてから情報を送り返すことができるため、カプセル化が壊れるからです。

その代わりに、オブジェクトを変更するために使用するサービスインターフェイスを作成する必要があります。 サーバー を使用して、モデルへの変更を適用します。

つまり、サービスは2つのパートに分かれているのです。

  1. すべてのエンティティのDTO表現をフェッチするために使用されるクエリ部分
  2. エンティティへの変更を適用するためのコマンド部