web-dev-qa-db-fra.com

JAVA: Différence entre l'entité et le DTO

Quelle est la différence entre un DTO et une entité? En détail, voici mes questions:

  1. Quels champs les DTO devraient-ils avoir? Par exemple, mes classes d'entités sont:

    @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;
    
    }
    

Il existe une connexion unilatérale (un à un) et une connexion bilatérale (plusieurs à un), une simple chaîne et des données entières et bien sûr les identifiants. Que mettre d'eux dans les classes MyFirstDTO et MySecondDTO?

  1. S'il existe un héritage entre les entités, comment dois-je le représenter dans les DTO? Par exemple:

    @Entity
    public class MyFirstEntity extends MySecondEntity {
        ....
    }
    
    @Entity
    public class MyFirstDTO extends MySecondDTO {
        ....
    }
    
  2. Comment dois-je les utiliser? Par exemple, je le découvre: je travaille sur un projet web. L'utilisateur de la page Web souhaite s'inscrire. Il/Elle remplit les formulaires et les envoie au serveur. Côté serveur je crée d'abord un DTO, car ses champs ont les validations. Depuis le DTO, je crée une entité et la conserve dans la base de données. Quand il y a une demande d'entité, je convertis l'entité demandée en DTO et la donne à l'utilisateur côté client. Est-ce une bonne imagination ou non?

15
Display Name

Réponse courte:

  • Les entités peuvent faire partie d'un domaine d'activité. Ainsi, ils peuvent implémenter un comportement et être appliqués à différents cas d'utilisation au sein du domaine.

  • Les DTO sont utilisés uniquement pour transférer des données d'un processus ou d'un contexte à un autre. En tant que tels, ils sont sans comportement - à l'exception des fonctions de stockage et de récupération très basiques et généralement standardisées.

Réponse longue:

Alors que le terme "objet de transfert de données" (DTO) est défini sans ambiguïté, le terme "entité" est interprété différemment dans divers contextes.

À mon avis, les interprétations les plus pertinentes du terme "entité" sont les trois suivantes:

  1. Dans le contexte de l'entreprise Java et jpa:
    "Un objet qui représente des données persistantes conservées dans une base de données."

  2. Dans le contexte de la "conception pilotée par le domaine" (par Eric Evans):
    "Un objet défini principalement par son identité, plutôt que par ses attributs."

  3. Dans le contexte de "l'architecture propre" (par Robert C. Martin):
    "Un objet qui encapsule les règles métier critiques à l'échelle de l'entreprise."

La communauté Jee et Jpa considère les entités principalement comme des objets mappés à une table de base de données. Ce point de vue est très proche de la définition d'un DTO - et c'est de là que vient probablement une grande partie de la confusion.

Dans le contexte de la conception pilotée par domaine, ainsi que du point de vue de Robert Martins, cependant, les entités font partie d'un domaine commercial et peuvent et doivent donc implémenter un comportement.

21
Andreas Vogl

Différence entre DTO et entité:

L'entité est mappée en classe sur une table. Dto est la classe mappée à la couche "view" principalement. Ce qu'il fallait stocker, c'est l'entité et ce qu'il fallait "montrer" sur la page Web, c'est le DTO.

Exemple: Si je veux stocker le modèle d'employé comme suit: Prenez l'employé comme exemple, j'ai besoin de stocker le sexe masculin/féminin/autre. Mais sur JSP, je dois afficher les trois valeurs sous forme d '"options" de formulaire afin que l'utilisateur puisse en sélectionner une.

@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.
}

tout en rendant jsp on peut donner

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

puis au printemps ou dans un autre cadre, celui qui sera sélectionné sera choisi comme genre dans l'entité. Ceci est rendu possible parce que Dto avait les trois valeurs de genre en lui. De même, selon la situation, les choses suivent. Comme la plupart du temps, nous avons besoin de la plupart des champs d'entité sur jsp, nous étendons dto par entité.

19
Shatayu Darbhe