La différence entre @entity et @embeddable annotation lorsque chacun est ajouté avant la déclaration de classe?
@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
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.
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;
}
}
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é.
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.