web-dev-qa-db-ja.com

JAVA:エンティティとDTOの違い

DTOとエンティティの違いは何ですか?詳細は、私の質問です。

  1. DTOにはどのフィールドが必要ですか?たとえば、私のエンティティクラスは次のとおりです。

    @Entity
    public class MyFirstEntity implements Serializable {
    
        @Id @GeneratedValue
        private Long id;
    
        private String stringData;
    
        @OneToOne
        private MySecondEntity mySecondEntity;
    
        @OneToMany
        private List<MySecondEntity> mySecondEntitesList;
    
    }
    
    @Entity
    public class MySecondEntity implements Serializable {
    
        @Id @GeneratedValue
        private Long id;
    
        private Integer integerData;
    
        @ManyToOne
        private MyFirstEntity myFirstEntity;
    
    }
    

片側接続(1対1)および両側接続(多対1)、単純な文字列および整数データ、そしてもちろんIDがあります。それらからMyFirstDTOおよびMySecondDTOクラスに何を入れますか?

  1. エンティティ間に継承がある場合、DTOでどのように表現する必要がありますか?例えば:

    @Entity
    public class MyFirstEntity extends MySecondEntity {
        ....
    }
    
    @Entity
    public class MyFirstDTO extends MySecondDTO {
        ....
    }
    
  2. それらをどのように使用すればよいですか?たとえば、私はこれを見つけます:私はWebプロジェクトに取り組んでいます。 Webページのユーザーが登録を希望しています。彼/彼女はフォームに記入し、サーバーに送信します。サーバー側では、フィールドに検証があるため、最初にDTOを作成します。 DTOからエンティティを作成し、データベースに永続化します。エンティティに対する要求がある場合、要求されたエンティティをDTOに変換し、クライアント側のユーザーに渡します。それは良い想像力ですか?

15
Display Name

短い答え:

  • エンティティは、ビジネスドメインの一部である可能性があります。したがって、動作を実装し、ドメイン内のさまざまなユースケースに適用できます。

  • DTOは、あるプロセスまたはコンテキストから別のプロセスまたはコンテキストにデータを転送するためにのみ使用されます。そのため、非常に基本的で通常標準化されたストレージおよび検索機能を除いて、動作はありません。

長答:

「データ転送オブジェクト」(DTO)という用語は非常に明確に定義されていますが、「エンティティ」という用語はさまざまなコンテキストで異なって解釈されます。

私の意見では、「エンティティ」という用語の最も適切な解釈は次の3つです。

  1. エンタープライズのコンテキストでJava and jpa:
    「データベースに保持されている永続データを表すオブジェクト。」

  2. 「domain-driven-design」のコンテキスト(Eric Evans作):
    「属性ではなく、アイデンティティによって主に定義されるオブジェクト。」

  3. 「クリーンアーキテクチャ」のコンテキスト(ロバートC.マーティンによる):
    「企業全体の重要なビジネスルールをカプセル化するオブジェクト。」

JeeコミュニティとJpaコミュニティは、エンティティを主にデータベーステーブルにマッピングされたオブジェクトと見なします。この観点は、DTOの定義に非常に近いものであり、おそらくそこから多くの混乱が生じています。

ただし、ドメイン駆動設計およびロバートマーチンズの観点では、エンティティはビジネスドメインの一部であるため、動作を実装できます。

21
Andreas Vogl

DTOとエンティティの違い:

エンティティは、テーブルにマップされたクラスです。 Dtoは主に「ビュー」レイヤーにマップされるクラスです。保存する必要があるのはエンティティで、Webページに「表示」する必要があるのはDTOです。

:次のように従業員モデルを格納する場合:従業員を例にとると、性別を男性/女性/その他のいずれかに格納する必要があります。しかし、JSPでは、ユーザーが1つを選択できるように、3つの値すべてをフォームの「オプション」として表示する必要があります。

@Entity
public class Employee{
//annotate with @Id and others

private Long id;
private String name;
private Gender gender; //this is enum viz Male,female
}
//Now extend Dto with employee

public EmployeeDto extends Employee{
Gender[] genders=Gender.values(); //put all gender types in array.
}

jspをレンダリングしている間に

<select name="gender"> //pointed towards entity gender field.
  <option value="Male">Male</option>
  <option value="Female">Female</option>
  <option value="Other">Other</option>
</select>

次に、春またはその他のフレームワークで、エンティティの性別として選択されたものが選択されます。これは、Dtoに3つの性別の値がすべて含まれているために可能になります。同様に、状況ごとに事柄が続きます。 ほとんどの場合、jspのエンティティフィールドのほとんどが必要なので、エンティティごとにdtoを拡張します。

19
Shatayu Darbhe