web-dev-qa-db-fra.com

Quelle est la différence entre @Entity et @embeddable

La différence entre @entity et @embeddable annotation lorsque chacun est ajouté avant la déclaration de classe?

  1. la première classe de création en tant qu'entité, la deuxième colonne d'insertion d'une autre table?
  2. la première classe de création en tant que table, tandis que la seconde est intégrée dans une autre classe?
  3. le premier définit la norme en tant que classe, le second définit le type de table
  4. le premier crée une table pour cette classe, le second intègre quelque chose dans une classe différente
  5. la première définit la propriété de table, la deuxième crée l'union de deux tables
22
Sanjeev Yadav

@Entity l'annotation sur une classe définit cela, elle a une existence distincte distincte. Ainsi, nous pouvons exécuter des requêtes DB, sans dépendre d'aucune autre classe. @Embeddable l'annotation sur une classe définit cela, elle n'a pas d'existence indépendante. Ainsi, nous ne pouvons pas exécuter de requêtes DB, sans dépendre d'une autre classe. Voici un exemple pour mieux le comprendre:

@Entity
User
  -- long id
  -- String name
  -- String email
     @Embedded
  -- UserDetails userDetail

@Embeddable
UserDetails
  -- Date dateOfBirth
  -- String sex
  -- String address
  -- String maritalStatus

Ici, vous pouvez voir sans avoir un User, UserDetails est inutile.

Généralement, dans la POO, nous concevons d'abord les classes, puis nous concevons les entités de base de données. Pour certaines classes (comme la classe UserDetails dans l'exemple ci-dessus), nous ne voulons pas avoir de tables distinctes dans DB, où leur existence indépendante n'a pas de sens. Dans ces cas, nous marquons la classe comme intégrable.

En règle générale, les classes intégrables partagent la même table que l'entité dans laquelle elles sont incorporées

47
Sazzadur Rahaman

Les entités ont une identité et peuvent être interrogées. Les éléments incorporables n'ont pas d'identité propre et ne peuvent être interrogés que pour l'utilisation des entités propriétaires.

Si vous ouvrez une classe d'entité, vous trouverez toujours le @Id annotation - elle est obligatoire. Si vous ouvrez une classe intégrable, vous ne trouverez jamais de @Id annotation - c'est interdit.

EDIT: Il n'est pas tout à fait correct que les intégrables ne puissent être stockés qu'en tant que partie du parent, c'est-à-dire dans le même tableau. Cela n'est vrai que pour les relations un à un. Vous pouvez avoir Collections et Maps d'objets incorporables dans l'entité parent et ils seront mappés sur les propres tables de collection.

17
kostja

Une classe d'entité est une classe définie par l'utilisateur ordinaire Java classe dont les instances peuvent être stockées dans la base de données.

@Entity
@Table(name="dog")
public class Dog{
    @Id
    @Column(name = "id")
    private int id;

    @Embedded
    private Animal animal;
    public Dog(int id,Animal animal){
        this.id=id;
        this.animal=animal;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Animal getAnimal() {
        return animal;
    }
    public void setAnimal(Animal animal) {
        this.animal = animal;
    }
}

Les classes intégrables sont des classes persistantes définies par l'utilisateur qui fonctionnent comme des types de valeur. Comme pour les autres types non d'entité, les instances d'une classe intégrable ne peuvent être stockées dans la base de données qu'en tant qu'objets incorporés, c'est-à-dire en tant que partie d'un objet entité contenant.

@Embeddable
public class Animal {

    @Column(name = "name")
    private String name;

    @Column(name = "location")
    private String location;
    public Animal(){
    }
    public Animal(String name,String location){
        this.name=name;
        this.location=location;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
}
5
Martin

C'est un sujet ancien mais j'aimerais ajouter ma réponse, qui est plus d'un point de vue théorique. En DDD (conception pilotée par domaine), nous avons généralement Entity et Value Objects. Les premiers ne sont identifiables que par un identity dont ils disposent. Les seconds ne sont pas définis par une identité, ce qui signifie que si tous les composants qui font que ces objets particuliers sont les mêmes, que les 2 objets de valeur sont les même.

L'analogie est que dans ce cas, si nous appliquions DDD, le Entity est la classe annotée avec @Entity et le Value Object est celui avec @Embeddable. Une démonstration de ceci est le fait que l'objet intégrable est ajouté en tant qu'informations supplémentaires à un enregistrement existant, qui a déjà its own identity défini en externe à l'objet incorporé.

2
NiVeR

Eh bien @Entity signifie que l'objet entité a une signification à lui tout seul, il ne nécessite aucune autre association avec aucun autre objet. Là où l'objet @Embeddable n'a pas de signification en soi, il a besoin d'être associé à un autre objet.

Prenons un exemple de disons que j'ai un objet employé et qu'il a une collection d'objet d'adresse comme variable membre. Maintenant, lorsque nous parlons d'une adresse, nous devons dire à qui elle appartient, quels employés l'adressent. Si nous parlons simplement de l'adresse, cela n'a aucun sens. J'espère que cela vous donne la différence entre les deux.

0
raj240