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.

24
demandé sur Jack 2013-08-07 13:04:44

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.

28
répondu u6f6o 2013-08-07 09:14:52

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.

21
répondu Juned Ahsan 2013-08-07 09:08:00

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.

5
répondu Kevin Bowersox 2013-08-07 09:15:09

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.

3
répondu Arnaud Denoyelle 2017-05-23 12:26:17

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

1
répondu Maxim Shoustin 2013-08-07 09:14:16

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.

0
répondu gjman2 2013-08-07 09:13:00

du JPA tag, je suppose que vous travaillez avec des haricots Java. Chaque haricot doit posséder les propriétés suivantes:

  1. Getters et setters pour l'ensemble de ses principales variables d'instance.

  2. Un constructeur vide.

  3. toutes ses variables d'instance devraient de préférence être private .

Ainsi l'affirmation : "chaque entité a besoin d'un constructeur vide".

-1
répondu JavaNewbie_M107 2013-08-07 09:10:35