Java entité - pourquoi ai-je besoin d'un constructeur vide?
cela pourrait vous sembler stupide,
mais pourquoi ai-je besoin de définir un constructeur vide dans Mes @Entity
?
chaque tutoriel que j'ai vu disait : chaque entité a besoin d'un constructeur vide.
mais Java vous donne toujours un constructeur invisible vide par défaut (si vous n'en redéfinissez pas un).
Merci.
EDIT
je pense qu'il y a un problème sémantique. Ce que j'ai compris par "besoin" était écrire.
qui signifie: écrivez toujours un constructeur vide dans votre entité.
exemple:
@Entity
public class MyEntity implements Serializable {
@Id
private String str;
public MyEntity(){}
//here getter and setter
}
mais Java vous donne toujours ce constructeur vide quand vous ne le redéfinissez pas (écrivez un autre avec des paramètres).
dans ce cas, écrire ce constructeur vide semble inutile.
7 réponses
un constructeur vide est nécessaire pour créer une nouvelle instance via la réflexion par votre cadre de persistance. Si vous ne fournissez aucun constructeur supplémentaire avec des arguments pour la classe, vous n'avez pas besoin de fournir un constructeur vide parce que vous en recevez un par défaut.
vous pouvez également utiliser l'annotation @PersistenceConstructor qui ressemble à la suivante
@PersistenceConstructor
public Movie(Long id) {
this.id = id;
}
pour initialiser votre entité si des données de printemps sont présentes dans votre projet. Ainsi, vous pouvez éviter le constructeur vide.
mais java vous donne toujours un constructeur vide invisible par défaut (si vous ne pas redéfinir).
cette affirmation n'est vraie que si vous ne fournissez aucun constructeur dans votre classe. Si un constructeur d'argument est fourni dans votre classe, alors jvm n'ajoutera pas le constructeur sans argument.
définir explicitement un constructeur par défaut n'est pas nécessaire sauf si vous fournissez un autre constructeur pour l'entité. Si vous fournissez un autre constructeur, en dehors de celui avec la signature du constructeur par défaut, le constructeur par défaut ne sera pas créé.
Depuis implémentations JPA dépendent de l'existence d'un constructeur par défaut, il est alors nécessaire d'inclure le constructeur par défaut qui sera omis.
comme vous avez spécifié la balise" JPA", je suppose que votre question s'applique uniquement à JPA et pas aux constructeurs vides en général.
Les cadres de persistance utilisent souvent la réflexion et plus spécifiquement Class<T>.newInstance()
pour instancier vos objets, puis appellent getters/setters par introspection pour définir les champs.
C'est pourquoi vous avez besoin d'un constructeur vide et de getters/setters.
Voir cette question sur StackOverflow vide constructeurs en hibernation.
en Fait vous n'avez pas besoin de l'écrire. Vous avez par défaut. Parfois, vous pouvez créer private
constructor pour empêcher les utilisateurs d'utiliser par défaut
public class MyClass{
private MyClass(){}
}
pour les motifs singelton, par exemple vous pouvez bloquer en utilisant le constructeur par défaut.
parfois, lorsque vous utilisez Gson
plugin pour convertir les données String Json à L'objet, il exige d'écrire constructeur par défaut, sinon il ne fonctionne pas
Java ne vous donne pas toujours un constructeur invisible vide par défaut si votre classe a un constructeur d'arguments, vous devez définir le constructeur vide par votre propre.
du JPA tag, je suppose que vous travaillez avec des haricots Java. Chaque haricot doit posséder les propriétés suivantes:
-
Getters et setters pour l'ensemble de ses principales variables d'instance.
-
Un constructeur vide.
-
toutes ses variables d'instance devraient de préférence être
private
.
Ainsi l'affirmation : "chaque entité a besoin d'un constructeur vide".